【问题标题】:Why is String.indexOf functioning like this? [duplicate]为什么 String.indexOf 会这样运行? [复制]
【发布时间】:2021-02-20 21:51:09
【问题描述】:

我正在尝试根据用户输入的查询匹配一些文本。在遇到一些问题后,我发现String.indexOf 的这种相当奇怪的行为我根本无法理解:

如果我尝试将不带变音符号的查询与带变音符号的字符串匹配,它会起作用:(不知道为什么)

"brezzel cu brânză".indexOf("bra")

11

但是将相同的字符串与后面的另一个字母匹配,不起作用:

"brezzel cu brânză".indexOf("bran")

-1

(在 Chrome 和 Firefox 中测试,行为相同)

这是我不知道的记录在案的行为还是这里到底发生了什么?

【问题讨论】:

  • a 不等于 .. brân 在字符串中但bran 不在字符串中
  • 如果这些字符在你看来是一样的(你的显示很奇怪),请在 js 控制台中运行一些代码。console.log("a"=="â")
  • Array.from("brânză") 揭示了字符串中的确切内容。
  • 源字符串中的“a”字符由正常的拉丁语“a”加上“组合抑扬符”字符组成,Unicode 代码点 770(十进制)。

标签: javascript diacritics


【解决方案1】:

如果我没记错的话,js 字符是用 2 个字节编码的。但许多其他 unicode 字符编码为 4 个字节。现在 char â 是 4 个字节。前 2 个字节是 a,这就是第一种情况有效的原因。使用转义函数查看:

escape("brezzel cu brânză")
"brezzel%20cu%20bra%u0302nza%u0306"

看到%20 是空格,然后是bra,然后是%u0302,它与之前的a 一起编码

也许你可以告诉其余的。如果你想测试它:

'a' + String.fromCharCode('0x0302') //â

【讨论】:

    猜你喜欢
    • 2019-05-20
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多