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

发布于 2024-11-29 20:51:24 字数 446 浏览 4 评论 0原文

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

I have two strings in Javascript: "_strange_chars_µö¬é@zendesk.com.eml" (f1) and "_strange_chars_µö¬é@zendesk.com.eml" (f2). At first glance, they look identical (and, indeed, on StackOverflow, they may be; I'm not sure what happens when they are pasted into a form like this.) In my application, however,

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

That is, where f1 uses the ö character, f2 uses an o and a diacritic ¨ as a separate character. What comparison can I do that will show these two strings to be "equal"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ζ澈沫 2024-12-06 20:51:24

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

f1 采用 普通形式 C(组合)和 f2< /code> 标准形式 D(分解)。一般来说,范式 C 是 Windows 和 Web 上最常见的形式,Unicode FAQ 将其描述为“一般文本的最佳形式”。不幸的是,苹果世界为了无缘无故地与众不同而选择了范式 D。

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

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

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

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

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

  • 将其发送回服务器端(例如通过XMLHttpRequest),您可以使用更好的语言来完成此操作。

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

f1 is in Normal Form C (composed) and f2 in Normal Form D (decomposed). In general Normal Form C is the most common on Windows and the web, with the Unicode FAQ describing it as “the best form for general text”. Unfortunately the Apple world plumped for Normal Form D in order to be gratuitously different.

The strings are canonically equivalent by the rules of Unicode equivalence.

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

In general, you convert both strings to one Normal Form of your choosing and then compare them. For example in Python:

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

Similarly Java has the Normalizer class, .NET has String.Normalize, and may languages have bindings available to the ICU library which also offers this feature.

Unfortunately, JavaScript has no native Unicode normalisation ability. This means either:

  • doing it yourself, carting around large Unicode data tables to cover it all in JavaScript (see eg here for an example implementation); or

  • sending it back to the server-side (eg via XMLHttpRequest), where you've got a better-equipped language to do it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文