【问题标题】:Removing non-printable character删除不可打印的字符
【发布时间】:2015-11-25 16:12:22
【问题描述】:

好的,所以我一直在用头撞桌子。

我正在导入一个由 Indesign 导出的 XML 文件。这会解析它并根据输入创建一个文件。 (我正在用 Node 构建一个 JS 应用程序)

这个文件在我的 PHPStorm IDE 中看起来不错。但是当我在 gedit 中打开它时,我会在这里和那里看到一些不需要的换行符。

我设法找到了这个字符:->
<-(它确实存在 - 将它复制到某处并使用箭头键将光标移动到它上面。它卡在中间)。

十六进制编辑器查看的这个字符显示它是0x80 0xE2 0xA9

当我尝试使用简单的 javascript 替换来替换它时;

data = data.replace('
', ''); //There IS a character in the left one. Trust me.

我收到以下解析错误;

在 vim 中,它在该位置显示以下字符; ~@�

我将如何从我的输出中删除它?转义 JS 代码中的字符导致它编译得很好,但是奇怪的字符仍然存在。我没有想法。

【问题讨论】:

  • 不就是可以用 Notepad++ (en.wikipedia.org/wiki/Byte_order_mark) 等编辑器删除的“BOM”字节顺序标记吗?
  • @pataluc 根据您自己的链接,它不是。
  • 有趣 - 似乎现在 chrome 确实打印了这个字符。它曾经是隐形的。

标签: javascript utf-8 character-encoding file-encodings


【解决方案1】:

您需要使用 '\u2029' 作为搜索字符串。您尝试替换的序列是 InDesign 插入的“段落分隔符”Unicode 字符。

所以:

string.replace('\u2029', '');

而不是角色本身。

【讨论】:

  • 酷,谢谢!我明天会检查一下。找到 UTF-8 字符的 unicode 版本的快速方法是什么?因为我没那么容易找到它。
  • @RobQuist 我已将编辑中的一个链接到我的答案。狩猎愉快!
  • 就是这样 :) string.replace(/[\u2029]/g, '');完成修复它。非常感谢戈兰!
  • 您需要使用\u2029 而不是实际的字符,原因与您需要使用\n 而不是常规换行符的原因相同:与其他语言不同,JavaScript 语法不允许字符串文字内的换行符。
  • @RobQuist:最简单的方法是在在线服务中查找文字字符。这是您提供的“空”字符的结果:fileformat.info/info/unicode/char/…
【解决方案2】:

String.replace() 并不完全按照您的想法工作。你使用它的方式,它只会替换第一次出现:

> "abc abc abc".replace("a", "x");
'xbc abc abc'

您需要添加g(全局)标志,唯一的标准方法是使用正则表达式作为匹配:

> "abc abc abc".replace(/a/g, "x");
'xbc xbc xbc'

您可以查看Fastest method to replace all instances of a character in a string for 进一步的想法。


search for 0x80 0xE2 0xA9 as UTF-8 显示该角色不存在,但它可能是 a mistype for 0xE2 0x80 0xA9,它对应于 'PARAGRAPH SEPARATOR' (U+2029),正如 Goran 在他的回答中指出的那样。只要您的所有工具集都正确配置为使用 UTF-8,您通常不需要将外来字符编码为 JavaScript \u#### 引用,但在这种情况下,JavaScript 引擎将其视为换行符,并且触发语法错误,因为您不允许在 JavaScript 字符串中使用换行符。

【讨论】:

  • 感谢您的提醒 :) 我知道替换功能,实际上我什至从不使用字符串,而是直接使用正则表达式 - 但这造成了麻烦,因此使用了字符串方法。不过值得一提!
  • 我认为 goran 有道理,我已经编辑了我的答案以添加更多信息。
  • 所以是的,我把它写错了,这就是为什么我找不到任何东西。原来 U+2028 也在 XML 中。
最近更新 更多