如何在Javascript中检查Unicode字符串的相等性?

时间:2011-08-17 18:49:23

标签: javascript string unicode normalization unicode-normalization

我在Javascript中有两个字符串:"_strange_chars_µö¬é@zendesk.com.eml"f1)和"_strange_chars_µö¬é@zendesk.com.eml"f2)。乍一看,它们看起来完全相同(事实上,在StackOverflow上,它们可能是;我不确定当它们被粘贴到这样的形式时会发生什么。)然而,在我的应用程序中,

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

也就是说,f1使用ö字符,f2使用 o 和变音¨作为一个单独的角色。我可以做什么比较,将这两个字符串显示为“相等”?

1 个答案:

答案 0 :(得分:8)

  

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

f1位于Normal Form C(组成)中,f2位于标准形式D(已分解)中。通常,Normal Form C是Windows和Web上最常见的,Unicode FAQ将其描述为“一般文本的最佳形式”。不幸的是,苹果公司为普通形式D而无足轻重。

字符串在规范上等同于Unicode equivalence的规则。

  

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

通常,您将两个字符串转换为您选择的一个Normal Form,然后进行比较。例如在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来覆盖所有这些(参见例如here的示例实现);或

  • 将其发送回服务器端(例如通过XMLHttpRequest),在那里你可以使用装备更好的语言。