我认为,我应该能够通过以下方式获取字符串的字节长度:
Buffer.byteLength('äáöü') // returns 8 as I expect
Buffer.byteLength('あいうえお') // returns 15, expecting 10
但是,当使用=LENB("あいうえお")
使用电子表格程序(libreoffice)获取字节长度时,我得到10(我期望)
那么,为什么我使用Buffer.byteLength
得到'あいうえお'的字节长度为15而不是10?
PS。 在这两个网站上测试“あいうえお”,我得到两个不同的结果
什么是正确的?发生了什么事?
答案 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,那么您已经用尽了该字节的所有可能值,并且您无法表示任何其他值。