java编码(四)编码错误例子

本文对比了两种从InputStream读取数据的方法,指出了一次读取大量字节可能导致中文字符截断的问题,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


错误的读取方式:
public  String getWeatherJson(InputStream is) {
         StringBuilder builder =  new  StringBuilder();
         InputStream is =  null ;   
         try  {               
             byte [] b =  new  byte [ 2048 ];
             for  ( int  n; (n = is.read(b)) != - 1 ;) {
                 builder.append( new  String(b,  0 , n,  "UTF-8" ));
             }
         catch  (UnsupportedEncodingException e) {
             e.printStackTrace();
         catch  (IOException e) {
             e.printStackTrace();
         finally  {
             try  {
                 is.close();
             catch  (IOException e) {
                 e.printStackTrace();
             }
         }
         return  builder.toString();
     }

正确的读取方式:
public  static  String fromIputStreamToString(InputStream is){
         ByteArrayOutputStream baos =  new  ByteArrayOutputStream();
         int  i = - 1 ;
         try  {
             while  ((i = is.read()) != - 1 ) {
                 baos.write(i);
             }
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         return  baos.toString();
     }

第一次:is.read(b)

第二次:is.read()
这个应该是根源,个人感觉第一次正好读到了半个中文字,而第二次是逐个字节读

用InputStreamReader吧,使用InputStream读取2048位有很大可能末字未读取到完整的编码,从而使用其构造字符串时导致错误编码.
文字读取可以使用InputStreamReader(inputStream, "UTF-8")来操作

读取“微”时打印的byte数组值,转为utf-8编码时,解析失败,出现乱码。一次读取2048个字节会造成中文字符的截断。第一个字节和最后一个字节都有可能是不完整的。
要么换一个编码如GBK,要么就用第二个方法。
一次读取2048个字节会造成中文字符的截断。第一个字节和最后一个字节都有可能是不完整的。

这样读一定是会出错的额!在每次2048个字节读完以后你不能保证这些字节就是刚刚好几个中文字符可能把后面一个中文字符给拆开来了,这样在用new String(b, 0, n, "UTF-8")转成string就会出现乱码了。后面一个是把所有的字节都读完了在同一装换就不会出现字符被拆的现象


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值