17

我在 Javascript 中有两个字符串:("_strange_chars_µö¬é@zendesk.com.eml"f1"_strange_chars_µö¬é@zendesk.com.eml"f2)。乍一看,它们看起来相同(实际上,在 StackOverflow 上,它们可能是相同的;我不确定将它们粘贴到这样的表单中会发生什么。)但是,在我的应用程序中,

f1[16] // ö
f2[16] // o
f1[17] // ¬
f2[17] // ̈

也就是说, wheref1使用ö字符,f2使用o和变音符号¨作为单独的字符。我可以做哪些比较来显示这两个字符串“相等”?

4

1 回答 1

8

f1使用 ö 字符,f2使用 o 和变音符号 ¨ 作为单独的字符。

f1范式C(组合)和f2范式 D(分解)。一般来说,Normal Form C 在 Windows 和 Web 上最常见,Unicode FAQ 将其描述为“一般文本的最佳形式”。不幸的是,Apple 世界为了与众不同而选择了 Normal Form D。

根据Unicode equivalence的规则,这些字符串在规范上是等效的。

我可以做哪些比较来显示这两个字符串“相等”?

通常,您将两个字符串都转换为您选择的一种范式,然后比较它们。例如在 Python 中:

>>> import unicodedata
>>> a= u'\u00F6'  # ö composed
>>> b= u'o\u0308' # o then combining umlaut
>>> unicodedata.normalize('NFC', a)==unicodedata.normalize('NFC', b)
True

类似地,Java 有Normalizer类,.NET 有String.Normalize,并且可能语言有可用于 ICU 库的绑定,ICU 库也提供此功能。

不幸的是,JavaScript 没有原生的 Unicode 规范化能力。这意味着:

  • 自己做,在大型 Unicode 数据表中使用 JavaScript 来覆盖所有内容(参见例如这里的示例实现);或者

  • 将它发送回服务器端(例如通过 XMLHttpRequest),在那里您可以使用更好的语言来执行此操作。

于 2011-08-17T20:12:33.673 回答