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

 关于流模式乱码

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

转载于:https://www.cnblogs.com/douyaer/p/8017952.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Java 字符串打印乱码的问题,可以考虑以下几个方面的原因和解决方法: 1. 字符编码不匹配:Java 字符串内部使用 Unicode 编码,而在进行输入输出时需要指定正确的字符编码。如果输入输出流的字符编码与字符串的编码不一致,就会出现乱码。可以尝试使用 `getBytes()` 方法字符串转换为指定编码的字节数组,并在输出时使用正确的字符编码解析。例如: ```java String str = "你好"; byte[] bytes = str.getBytes("UTF-8"); System.out.println(new String(bytes, "UTF-8")); ``` 2. 控制台字符编码不支持:有些操作系统的控制台默认字符编码可能不支持显示特定字符,导致输出乱码。可以尝试在控制台中设置合适的字符编码。例如,在 Windows 中可以使用以下命令设置控制台编码为 UTF-8: ``` chcp 65001 ``` 3. IDE 或编辑器的字符编码设置不正确:有些 IDE 或文本编辑器默认使用的字符编码可能与源代码文件的实际编码不一致,导致读取或保存文件时出现乱码。可以尝试更改 IDE 或编辑器的默认字符编码设置。 4. 字符串包含特殊字符或非打印字符:如果字符串中包含特殊字符或非打印字符,可能会导致乱码。可以尝试使用转义字符或者特定的字符处理方法来处理这些字符。 希望以上解决方法对您有帮助。如果问题仍然存在,请提供更多的详细信息和代码示例,以便更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值