UTF-8编码-将字符串写入文件,当字符串中包含中文时,出现写入文件的数据残缺,而当不包含中文时,写入文件的数据正常

场景:(UTF-8编码)将字符串写入文件,当字符串中包含中文时,出现写入文件的数据残缺,而当不包含中文时,写入文件的数据正常。示例:
写入文件的代码:
File txt=new File(url);
if(!txt.exists()){
    txt.createNewFile();
}
byte bytes[]=new byte[1024];
bytes=str.getBytes("UTF-8"); 
int b=str.length();
FileOutputStream fos=new FileOutputStream(txt,true);
fos.write(bytes,0,b);

fos.close();

示例结果:

String str = "fadsfdsf212";    写入文件内容:fadsfdsf212
String str = "4564大地方122321";    写入文件内容:4564大地方

 

分析:

存在问题的原因在于,计算字符串的长度时,一个中文长度只算成1,而实际上以UTF-8编码的中文占3个字节,所以实际由str.length()得到的b的值小于实际字节数,导致出现数据写入残缺的情况。


解决方法:
思路:计算正确的字节数。
首先是获取到字符串中的中文的个数count,由于每个中文占3个字节,而上述str.length()的方式只把中文按一个字节计算,即每个中文少计算了2个字节,则实际的字节数应该等于str.length()+count*2。
代码修改如下:
String regex = "[\u4e00-\u9fff]";
int count = (" " + str + " ").split (regex).length - 1;  //匹配字符串中的中文个数
File txt=new File(url);
if(!txt.exists()){
    txt.createNewFile();
}
byte bytes[]=new byte[1024];
bytes=str.getBytes("UTF-8");
int b=str.length()+count*2;  //补上漏算的字节数
FileOutputStream fos=new FileOutputStream(txt,true);  //true表示将字符串追加在文件原有内容后面
fos.write(bytes,0,b);

fos.close();

PS:   GBK编码:一个中文占2个字节,UTF-8编码:一个中文占3个字节

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值