关于字符串读写乱码的解决方法浅谈

Posted 爱编程的douyaer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于字符串读写乱码的解决方法浅谈相关的知识,希望对你有一定的参考价值。

 关于流模式乱码

const fs=require(‘fs‘);
var rs=fs.createReadStream(‘1.txt‘);
var str=‘‘;
rs.on(‘data‘,function(chunk){
    str+=chunk;//此处内置处理机制 str=str.toString()+chunk.toString()
    console.log(chunk)//chunk是buffer对象
})
rs.on(‘end‘,function(){
    console.log(str)//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少
})

var rs1=fs.createReadStream(‘1.txt‘,{highWaterMark:11});
var str1=‘‘;//设置流模式每次读取10个字节 一个汉字三个字节 发生乱码
rs1.on(‘data‘,function(chunk1){
    str1+=chunk1;
    console.log(chunk1)
})
rs1.on(‘end‘,function(){
    console.log(str1)
})
/* <Buffer a7 89 e6 99 93 ef bc 8c e5 a4>
<Buffer 84 e5 a4 84 e9 97 bb e5 95 bc>
<Buffer e9 b8 9f 3b e5 a4 9c e6 9d a5>
<Buffer e9 a3 8e e9 9b a8 e5 a3 b0 ef>
<Buffer bc 8c e8 8a b1 e8 90 bd e7 9f>
<Buffer a5 e5 a4 9a e5 b0 91 e3 80 82>
春眠不???晓,??处闻啼鸟;夜来风雨声???花落??多少。 */

 解决办法1,流模式自带设置编码格式

const fs=require(‘fs‘);
var rs=fs.createReadStream(‘1.txt‘,{highWaterMark:11});
rs.setEncoding(‘utf-8‘); 
var str=‘‘;
rs.on(‘data‘,function(chunk){
    str+=chunk;//此处内置处理机制 str=str.toString()+chunk.toString()
    console.log(chunk)//chunk是buffer对象
})
rs.on(‘end‘,function(){
    console.log(str)//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少
})
// 春眠不 
// 觉晓,处  
// 处闻啼鸟
// ;夜来风
// 雨声,花
// 落知多
// 少。
// 春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少。

解决方案2,buffer对象拼接

const fs=require(‘fs‘);
const iconv=require(‘iconv-lite‘);
var rs=fs.createReadStream(‘1.txt‘,{highWaterMark:11});
var str=‘‘;
var size=0;
var chunks=[];
rs.on(‘data‘,function(chunk){
    chunks.push(chunk);//将每次读取的buffer对象放入数组
    size+=chunk.length;//统计所有元素的个数
})
rs.on(‘end‘,function(){
   var buf=Buffer.concat(chunks,size);//合并成一个大buffer对象
   console.log(iconv.decode(buf,‘utf-8‘))//用iconv转换
})//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少。

解决方案3,自己拼接

const fs=require(‘fs‘);
const iconv=require(‘iconv-lite‘);
var rs=fs.createReadStream(‘1.txt‘,{highWaterMark:11});
var str=‘‘;
var size=0;
var chunks=[];
var n=0;
rs.on(‘data‘,function(chunk){
    chunks.push(chunk);//将每次读取的buffer对象放入数组
    size+=chunk.length;
})
rs.on(‘end‘,function(){
  var buf=new Buffer(size);
  chunks.forEach(function(e){
      for(let i=0;i<e.length;i++){
          buf[n]=e[i];
          n++;
      }
  })
  console.log(iconv.decode(buf,‘utf-8‘))
})//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少。

highWaterMark的值越大,文件读取速度越快

以上是关于关于字符串读写乱码的解决方法浅谈的主要内容,如果未能解决你的问题,请参考以下文章

关于乱码问题的解决与HttpServletResponse中的方法

关于乱码问题的解决与HttpServletResponse中的方法

关于乱码问题的解决与HttpServletResponse中的方法

关于java代码提交HTTP POST请求中文乱码的解决方法

JAVA读写文件,如何避免中文乱码

RandomAccessFile 文件读写中文乱码解决方案!