不知道我是不是太土了,一个关于中文字符串长度问题的解决。
发布于 3年前 作者 saighost 2426 次浏览

被bug折腾了1天,才发现原来是中文字符串长度的问题。。。这次长记性了。

console.log('正常分娩'.length)
console.log(Buffer.byteLength('正常分娩', 'utf8'))

竟然是有差的。。。这个以前真没有注意过啊!

刚开始在调用web service时服务器返回400错误,经多次试验发现只有当参数里有中文值时会出现这个问题,一直以为是编码问题,各种转码后发现问题依旧。在论坛挖了坟之后去看api,然后从新检查代码。 终于在soap模块里找到header组装时这个bug,http.js小改了一下就解决了。 把

headers["Content-Length"] = data.length;

改为

headers["Content-Length"] = Buffer.byteLength(data, 'utf8');

服务调用成功。

12 回复

哈哈哈,byteLength的坑

你这坑挖得可够深的!谢谢分享!

一个汉字两个Bytes…

奇怪,好像不是一个汉字两个Bytes,请看结果:

console.log('正常分娩’.length)

4

undefined

console.log(Buffer.byteLength('正常分娩’, ‘utf8’))

12

undefined

噢!是我搞混了! utf-8编码下,一个汉字是3字节存储的!

UTF-8编码还真是搞脑子, 对各国语言的存储长度都不一样, 其中汉字它用3字节存储!

参考资料: 

zh.wikipedia.org 写道

UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节,其他基本多文种平面(BMP)中的字符(CJK中日韩汉字属于此类)使用三个字节,其他 Unicode 辅助平面的字符使用四字节编码。

@PittMak 不同编码是不一样的,utf8里面可不只2个字节

现在完全明白了!

原来是 buffer 这个东西是读字节的… 好嘛没那么神秘了

你挖的也好深啊~

HTML头的Content-Length:需要的是字节数,不是字符的个数,所以用byteLength,切记切记!:-)

回到顶部