【问题标题】:Why normalize() method doesn't work in some cases?为什么 normalize() 方法在某些情况下不起作用?
【发布时间】:2021-11-01 00:20:01
【问题描述】:

默认情况下,String.prototype.normalize() 使用 NFC 作为参数。 NFC 将多个字符替换为单个字符。

MDN

您可以指定“NFC”来获取组合的规范形式,其中 多个代码点被替换为单个代码点,其中 可能。

这里有一个来自 MDN 的例子。它有效。

let str = '\u006E\u0303';
str = str.normalize();
console.log(`${str}: ${str.length}`);

但后来我决定用其他角色尝试这种方法。例如:

let str = '\u0057\u0303';
str = str.normalize();
console.log(`${str}: ${str.length}`);

第二个例子有什么问题?为什么它不起作用?

【问题讨论】:

  • 可能是因为 unicode 中不存在单个字符 W̃(更进一步,因为地球上没有任何语言使用这个字符)

标签: javascript normalize


【解决方案1】:

它不会替换多个字符,它会替换多个代码点并且仅在可能的情况下。

ñ,a character used in Spanish 在 unicode 中有自己的代码点: — U+00D1 — 所以你可以说ñ 而不是“取一个n,然后在它上面放一个~ ”。

W̃,即a representation of a phonic sound 没有自己的代码点。它是一个相对很少使用的字符,因此在更有效的 Unicode 位中没有给予宝贵的空间。唯一的办法就是说“拿一个W,然后在上面放一个~”。

【讨论】:

  • 啊,我明白了。我想到了这一点,但后来我决定使用方法codePointAt() 检查这个字符是否有自己的代码点。它返回87。但是......之后,检查这个返回的号码,我意识到87 是通常的W,而不是W̃。看起来 codePointAt 刚刚返回了第一个字符的代码点
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2021-11-02
  • 2018-11-28
相关资源
最近更新 更多