node.js:获取字符串“あいうえお”的字节长度

时间:2015-08-21 03:42:02

标签: node.js utf-8

我认为,我应该能够通过以下方式获取字符串的字节长度:

Buffer.byteLength('äáöü')      // returns 8 as I expect
Buffer.byteLength('あいうえお')  // returns 15, expecting 10

但是,当使用=LENB("あいうえお")使用电子表格程序(libreoffice)获取字节长度时,我得到10(我期望)

那么,为什么我使用Buffer.byteLength得到'あいうえお'的字节长度为15而不是10?

PS。 在这两个网站上测试“あいうえお”,我得到两个不同的结果

什么是正确的?发生了什么事?

1 个答案:

答案 0 :(得分:4)

node.js是正确的。字符串“あいうえお”的UTF-8表示长度为15个字节:

E3 81 82 = U+3042 'あ'
E3 81 84 = U+3044 'い'
E3 81 86 = U+3046 'う'
E3 81 88 = U+3048 'え'
E3 81 8A = U+304A 'お'

另一个字符串是UTF-8中的8个字节长,因为它包含的Unicode字符位于U + 0800边界之下,并且每个字符都可以用两个字节表示:

C3 A4 = U+E4 'ä'
C3 A1 = U+E1 'á'
C3 B6 = U+F6 'ö'
C3 BC = U+FC 'ü'

从我在文档中看到的内容,LibreOffice的LENB()函数正在做一些与众不同的事情:

  • 对于仅包含ASCII字符的字符串,它返回字符串的长度(也是用于将其存储为ASCII的字节数)。

  • 对于包含非ASCII字符的字符串,它返回以UTF-16格式存储所需的字节数,该字符串对U + 10000下的所有字符使用两个字节。 (我不确定它对上面的字符做了什么,或者它甚至根本不支持它们。)

衡量与Buffer.byteLength相同的内容,应该被忽略。

关于您正在测试的其他工具:字节大小问题是错误的。假设所有直到U + FF的Unicode字符都可以用一个字节表示,所有其他字符可以用两个字节表示。任何字符编码都不是这样。事实上,它是不可能的。如果使用一个字节将每个字符编码为U + FF,那么您已经用尽了该字节的所有可能值,并且您无法表示任何其他值。