Jam*_*sen 17 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] // ?
Run Code Online (Sandbox Code Playgroud)
也就是说,在f1
使用ö字符,f2
使用一个ö和音调符号¨作为一个单独的字符.我能做什么比较才能证明这两个字符串"相等"?
f1
使用ö字符,f2
使用o和变音符号作为单独的字符.
f1
是正常形式 C(组成)和f2
正常形式D(分解).通常,Normal Form C是Windows和Web上最常见的,Unicode FAQ将其描述为"一般文本的最佳形式".不幸的是,苹果公司为普通形式D而无所畏惧.
这些字符串在规范上等同于Unicode等价规则.
我能做什么比较才能证明这两个字符串"相等"?
通常,您将两个字符串转换为您选择的一个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
Run Code Online (Sandbox Code Playgroud)
类似地,Java具有Normalizer
.NET所具有的类,String.Normalize
并且可能语言具有可用于ICU库的绑定,ICU库也提供此功能.
不幸的是,JavaScript没有本机Unicode规范化能力.这意味着:
自己动手,在大型Unicode数据表中使用JavaScript来覆盖它们(参见此处的示例实现); 要么
将它发送回服务器端(例如通过XMLHttpRequest),在那里你可以使用装备更好的语言来完成它.
归档时间: |
|
查看次数: |
1866 次 |
最近记录: |