• 首页
  • nodejs
  • node.js 下将汉字写入Buffer时,Buffer长度如何控制?

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
一段优雅的文字出现了


回到顶部