为什么 String.indexOf 会这样运作?
Why is String.indexOf functioning like this?
我正在尝试根据用户输入的查询来匹配一些文本。在遇到一些问题后,我发现 String.indexOf
这种我根本无法理解的相当奇怪的行为:
如果我尝试将不带变音符号的查询与带变音符号的字符串进行匹配,它会起作用:(不知道为什么)
"brezzel cu brânză".indexOf("bra")
11
但是将同一个字符串与它后面的另一个字母匹配是行不通的:
"brezzel cu brânză".indexOf("bran")
-1
(在 Chrome 和 Firefox 中测试,行为相同)
这是我不知道的有记录的行为吗?或者这里到底发生了什么?
如果我没记错的话,js字符是按2字节编码的。但是许多其他 unicode 字符编码为 4 个字节。现在 char â 是 4 个字节。前 2 个字节是 a,这就是第一种情况起作用的原因。使用转义函数查看:
escape("brezzel cu brânză")
"brezzel%20cu%20bra%u0302nza%u0306"
看到 %20
是 space,然后是 bra,然后是 %u0302
,它与前面的 a
一起编码 â
。
可能你会告诉剩下的。如果你想测试它:
'a' + String.fromCharCode('0x0302') //â
我正在尝试根据用户输入的查询来匹配一些文本。在遇到一些问题后,我发现 String.indexOf
这种我根本无法理解的相当奇怪的行为:
如果我尝试将不带变音符号的查询与带变音符号的字符串进行匹配,它会起作用:(不知道为什么)
"brezzel cu brânză".indexOf("bra")
11
但是将同一个字符串与它后面的另一个字母匹配是行不通的:
"brezzel cu brânză".indexOf("bran")
-1
(在 Chrome 和 Firefox 中测试,行为相同)
这是我不知道的有记录的行为吗?或者这里到底发生了什么?
如果我没记错的话,js字符是按2字节编码的。但是许多其他 unicode 字符编码为 4 个字节。现在 char â 是 4 个字节。前 2 个字节是 a,这就是第一种情况起作用的原因。使用转义函数查看:
escape("brezzel cu brânză")
"brezzel%20cu%20bra%u0302nza%u0306"
看到 %20
是 space,然后是 bra,然后是 %u0302
,它与前面的 a
一起编码 â
。
可能你会告诉剩下的。如果你想测试它:
'a' + String.fromCharCode('0x0302') //â