JavaScript Unicode:相同的字母但不同的Unicode

4

我需要将文本发送到一个只接受特定类型的特殊字符(如ï)的打印服务。我的客户以某种方式输入文本,使得字母看起来相同,但具有不同的底层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上使用荷兰键盘布局)?我猜这与操作系统或键盘布局有关,但我找不到列出差异或任何相关问题的列表。是否有人建议如何继续?


1
它们都是有效的。重音字符可以通过组合两个字符来完成,许多字符也有专用字符。似乎打印服务无法处理某些类型的有效Unicode,这听起来像一个错误。 - Necreaux
谢谢您的评论。确实是打印服务中的一个错误,但超出了我更改该代码的范围。是否有一种(简单)方法可以将所有组合转换为单个专用字符? - user3136936
1
正如当前的答案所强调的那样,我认为您在撰写问题时打错了示例数据。[U+0308](http://www.fileformat.info/info/unicode/char/0308/index.htm)只是分音符号(当然,[U+0020](http://www.fileformat.info/info/unicode/char/0020/index.htm)是传统的空格)。 - Álvaro González
@ÁlvaroG.Vicario 我已根据Kevin Hakanson的答案更正了问题的Unicode代码点编号。 - Basil Bourque
“将所有组合成一个单独的专用字符”——这个概念只适用于Unicode有专用字符的情况。对于可以应用组合字符的基本字符没有限制,也没有组合字符序列的限制。 - Tom Blodget
2个回答

5
如评论所指出的那样,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,可以寻找一些兼容库。


4

\u00EF 表示的是ï,或者说是带分音符的拉丁小写字母i(Latin Small Letter I with Diaeresis),而 \u0020 则表示空格字符(Space character)

\u0069\u0308 表示的是拉丁小写字母i(Latin Small Letter I)后跟着一个组合分音符(Combining Diaeresis

Normalization 需要将第二个由两个字符组成的序列转换为第一个序列。在将其发送到打印服务之前,您需要找到一些工具来执行此归一化操作。

请参阅 JavaScript Unicode normalization,以获取一些选项。


2
为什么要踩这个回答?它是完全有用和正确的。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接