奇怪的重音长度为"é"字符串返回2

hyp*_*pee 9 javascript

我有一个我无法解释的奇怪问题.我正在尝试操纵带有重音的字符串为"é".此字符串来自输入文件类型的图像名称.

我无法理解的是为什么我用解析字符解析时的字符串被分成两个字符.以下是一个更好理解的示例:

é分为两个性格像这样e:?.

"é".length
=> 2
Run Code Online (Sandbox Code Playgroud)

涉及utf8的可能性有多大?

我真的什么都不懂!

xan*_*tos 11

它们被称为组合变音符号.它们是Unicode的"片段"......一些可以在任何角色上"链接"的可组合变音符号.很明显,在这种情况下,字符串的长度是2(因为有e'.预先组合的字符àéèìòù已经保留了兼容性,但现在任何字符都可以重音:-)显然99%的程序员不知道它,99.9%的程序非常支持它.我很确定它们可以在某处被用作攻击媒介(但我不是偏执狂:-))

我甚至会补充说,即使是2009年的Skeet也不确定它们是如何工作的:http://codeblog.jonskeet.uk/2009/11/02/omg-ponies-aka-humanity-epic-fail/

你看,我不记得组合字符是在基本字符之前还是之后

:-) :-)

  • @SayemAhmed因为在某一步你可能强迫重新组合e +'在è:-)尝试"e\u0301"; (新行)"e\u0301".length (2认同)

ken*_*ytm 8

而不是UTF-8,更有可能结合所涉及的变音标记.

>>> "e\u0301"
"e?"
>>> "e\u0301".length
2
Run Code Online (Sandbox Code Playgroud)

Javascript的字符串通常编码为UTF-16,因此它可以包含1个代码单元中的整个单个"é"(U + 00e9).


但是BMP之外的字符(代码点超出U + FFFF的字符)将返回2,因为它们被编码为2个UTF-16代码单元.

>>> "".length
2
Run Code Online (Sandbox Code Playgroud)