我有一个奇怪的问题无法解释。我试图处理一个带重音符号的字符串,比如 "é"。这个字符串来自于一个输入文件类型中的图片名称。
我不理解的是,为什么当我试图遍历这个字符串时,其中的重音字符会被分成两个字符。以下是一个例子,以更好地理解:
我的字符 é
被分成了两个字符,如下所示:e
& ́
。
"é".length
=> 2
可能涉及到utf8编码?
我真的什么都不懂!
我有一个奇怪的问题无法解释。我试图处理一个带重音符号的字符串,比如 "é"。这个字符串来自于一个输入文件类型中的图片名称。
我不理解的是,为什么当我试图遍历这个字符串时,其中的重音字符会被分成两个字符。以下是一个例子,以更好地理解:
我的字符 é
被分成了两个字符,如下所示:e
& ́
。
"é".length
=> 2
可能涉及到utf8编码?
我真的什么都不懂!
e
和'
)。像àéèìòù
这样的预组合字符已被保留以实现兼容性,但现在任何字符都可以加重音符:-) 显然,99%的程序员不知道它,而99.9%的程序对其支持非常差。我相当确定它们可以在某个地方用作攻击向量(但我不是偏执狂 :-))
我甚至要补充说,即使是Skeet在2009年也不确定它们是如何工作的:http://codeblog.jonskeet.uk/2009/11/02/omg-ponies-aka-humanity-epic-fail/
你看,我记不清组合字符是在基本字符之前还是之后
:-) :-)
"é".length
部分并将其粘贴到我的控制台上。 - MD Sayem Ahmed与UTF-8不同,更可能涉及组合变音符号。
>>> "e\u0301"
"é"
>>> "e\u0301".length
2
Javascript字符串通常编码为UTF-16,因此它可以在一个代码单元中包含整个字符“é”(U+00e9)。
但超出BMP范围的字符(那些代码点超过U+FFFF的字符)将返回2,因为它们被编码成2个UTF-16代码单元。
>>> "".length
2