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

标签 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 和变音符号 ¨ 作为一个单独的字符。我可以做什么比较来显示这两个字符串“相等”?

最佳答案

f1 uses the ö character, f2 uses an o and a diacritic ¨ as a separate character.

f1Normal Form 中范式 D(分解)中的 C(组合)和 f2。一般来说,Normal Form C 在 Windows 和 Web 上最常见,Unicode FAQ 将其描述为“一般文本的最佳形式”。不幸的是,Apple 世界为 Normal Form D 倾倒,以便无缘无故地与众不同。

根据 Unicode equivalence 的规则,这些字符串是规范等价的.

What comparison can I do that will show these two strings to be "equal"?

通常,您将两个字符串都转换为您选择的一种范式,然后比较它们。例如在 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 库的绑定(bind),该库也提供此功能。

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

  • 自己动手,处理大型 Unicode 数据表以用 JavaScript 覆盖所有内容(参见例如 here 的示例实现);或者

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

关于javascript - 如何检查 Javascript 中 Unicode 字符串的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7097867/

相关文章:

javascript - 如何模拟 JavaScript yield?

javascript - Extjs4 MVC 将项目保存到服务器

c++ - 递归字符串转换

c# - 从一个类到另一个类调用字符串方法

python - 如何在Python2中循环遍历\u2190-\u21FF的范围

javascript - ExtJs4 - 点击事件图表?

javascript - ionic 推送通知 : How to handle onClick?

c# - C# 中的 String.Replace(char, char) 方法

c++ - 不打印 5 个字母长的 unicode

regex - 字符名称,替换和Umlaut “Ü”:格式错误的UTF-8字符