【问题标题】:Javascript Unicode: same letters but different unicodeJavascript Unicode:相同的字母但不同的Unicode
【发布时间】:2015-08-15 01:04:52
【问题描述】:

我必须将文本发送到打印服务,它只接受某些类型的特殊字符,即 ï。我的客户以某种方式输入文本,使字母看起来相同,但具有不同的底层 unicode 符号,因此打印服务无法正确处理。示例:

Mine: ï (unicode \u00EF)
Theirs: ï (unicode \u0069\u0308), copy pasting the 2 symbols in chrome bar for example, will show that it actually looks the same in textarea's)

如何将所有特殊字符从“他们的风格”转换为“我的风格”(Windows 上的荷兰语键盘布局)?我猜这与操作系统或键盘布局有关,但我找不到说明差异或与此问题相关的任何内容的列表。有人建议如何进行吗?

【问题讨论】:

  • 它们都是有效的。重音字符可以通过合成两个字符来完成,并且许多字符还具有专用字符。听起来像是打印服务无法处理某些类型的有效 Unicode 的错误。
  • 感谢您的评论。这确实是打印服务中的一个错误,但我无法更改该代码。有没有一种(简单的)方法可以将所有作品转换为单个专用角色?
  • 作为当前答案突出显示,我认为您在撰写问题时输入了错误的示例数据。 U+0308 只是分音符(当然,U+0020 是很好的旧空白)。
  • @ÁlvaroG.Vicario 我根据 Kevin Hakanson 的回答更正了问题的 Unicode 代码点编号。
  • “所有组合到一个专用字符”——这个概念仅适用于 Unicode 具有专用字符的情况。对可以应用组合字符的基本字符没有限制,对组合字符的顺序也没有限制。

标签: javascript unicode keyboard-layout


【解决方案1】:

\u00EF 是 ï 或 Latin Small Letter I with Diaeresis(而 \u0020 是 空格 字符)

\u0069\u0308拉丁文小写字母 I,后跟 Combining Diaeresis

需要Normalization 将第二个双字符序列转换为第一个。在发送到打印服务之前,您需要找到一些实用程序来执行此规范化。

请参阅JavaScript Unicode normalization 了解一些选项。

【讨论】:

  • 为什么投反对票?非常有用且正确的答案。
【解决方案2】:

正如 cmets 中正确指出的那样,有两种方法(或“规范化形式”)可以在 unicode 中表示重音字符:

  • 带有专用符号 (\u00EF == ï)
  • 由基本字母+重音组成(即i + ¨ == i + \u0308 == ï

ES6 增加了一个专门的函数,在规范化形式之间转换字符串:String.normalize

// convert one-char ("composed") to multiple-chars ("decomposed") form:
escape("\u00EF".normalize("NFD"))  
> "i%u0308"

// convert decomposed form to composed:
escape("i\u0308".normalize("NFC"))  
> "%EF"

如果您的系统还不支持normalize,请四处寻找垫片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多