node.js 下将汉字写入Buffer时,Buffer长度如何控制?
先来温习下基础知识.
一个字节(Byte)占8位(bit)
一个英文字母占一个字节,一个汉字占2个字节.
请注意,这里有个"坑" ,一个汉字占2个字节的前提是unicode编码,如果是utf-8 编码的时候,一个汉字占用几个字节呢? 翠花,上代码!
var fs=require('fs'); var str='一段优雅的文字出现了'; bufstr = new Buffer(str.length*2); for(j=0;j<str.length;j++){ bufstr.write(str[j],j*2,'utf8'); } console.log(bufstr.toString('utf8',0,bufstr.length));
悲剧啊,结果如下
为啥出现这种问题呢,有人说我的代码写错了,这还用你说,我早就知道写错了,关键是那里错了^_^
buffer 里是按字节逐个写入,但是我们错误的认为一个汉字占用2个字节,所以buffer 初始化长度给了字符串长度的2倍,并且每次写入一个汉字时,buffer 偏移量自动后退2位,但是出错了...(如果这里你的buffer长度按照字符串长度创建,并且每次偏移量后移一位,那么直接去面壁吧!)
验证一下 utf-8 编码的汉字占用几位?
console.log(Buffer.byteLength('小小','utf8'));
zhangzhi@moke:~/code$ node > console.log(Buffer.byteLength('小小','utf8')); 6
运行结果是6,那就是说utf-8编码下一个汉字占用3个字节.为了验证我们修改一下上面的代码
var fs=require('fs'); var str='一段优雅的文字出现了'; bufstr = new Buffer(str.length*3); for(j=0;j<str.length;j++){ bufstr.write(str[j],j*3,'utf8'); } console.log(bufstr.toString('utf8',0,bufstr.length));
运行结果:
zhangzhi@moke:~/code$ node fstest.js 一段优雅的文字出现了