zoukankan      html  css  js  c++  java
  • 关于字符串读写乱码的解决方法浅谈

     关于流模式乱码

    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的值越大,文件读取速度越快

  • 相关阅读:
    vmware和主机通信方法
    曾经的读书计划
    Linux下的autoconf和automake
    Nor Flash读写方法
    Linux下的动态库和静态库
    asp.net读取Xml文件到DataSet,以及DataSet保存为Xml,利用自带的强大功能
    SqlServer 2000/2005 列转行 行转列收集
    GridView 模板列 在后台获取该行某控件的值 例如批量修改
    C# DllImport的用法 调用Window的一些常用功能
    C#通用数据库操作类 支持Access/MSSql/Orale/MySql等数据库
  • 原文地址:https://www.cnblogs.com/douyaer/p/8017952.html
Copyright © 2011-2022 走看看