Javascript Unicode: 字母相同但 unicode 不同

Javascript Unicode: same letters but different unicode

我必须将文本发送到打印服务,它只接受特定类型的特殊字符,即 ï。我的客户以某种方式输入文本,使字母看起来相同,但具有不同的底层 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)

如何将所有特殊字符从 "their style" 转换为 "my style"(Windows 上的荷兰语键盘布局)?我想这与 OS 或键盘布局有关,但我找不到说明差异或与此问题相关的任何内容的列表。有人对如何进行有建议吗?

正如评论中正确指出的那样,在 unicode 中有两种方式(或 "normalization forms")表示重音字符:

  • 带有专用符号 (\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,请四处寻找垫片。

\u00EF 是 ï 或带分音符的 拉丁文小写字母 I (而 \u0020 是 Space字符)

\u0069\u0308 拉丁小写字母 I 后接 组合分音符

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

有关某些选项,请参阅 JavaScript Unicode normalization