分享

Android中文乱码彻底解决

 w_hf的图书馆 2011-08-03
Android中文乱码彻底解决

以下是我研究的成果,希望对您有帮助:

Java代码 复制代码 收藏代码
  1. sb = new StringBuffer();
  2. HttpEntity entity = response.getEntity();
  3. InputStream is = entity.getContent();
  4. BufferedReader br = new BufferedReader(
  5. new InputStreamReader(is,"GB2312"));
  6. String data = "";
  7. while ((data = br.readLine()) != null) {
  8. sb.append(data);
  9. }
  10. String result = sb.toString();
Java代码 复制代码 收藏代码
  1. //下面的是多余的代码,平台会按照默认编码读数据,谢谢melode11和eleda指点 result = new String(result.getBytes(),"UTF-8");

我解释一下,

Java代码 复制代码 收藏代码
  1. BufferedReader br = new BufferedReader(
  2. new InputStreamReader(is,"GB2312"));


是读取要改编码的源,源的格式是GB2312的,安源格式读进来,然后再对源码转换成想要的编码就行

分享到:
评论
12 楼 vvvpig 2010-09-18 引用
还是万恶的java编码问题啊
11 楼 zjjgogogo 2010-09-07 引用
楼主,感谢啊!
10 楼 bashenmail 2009-11-23 引用
melode11 写道
melode11 写道
bashenmail 写道
melode11 写道
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。

Java代码 复制代码 收藏代码
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同吗?还请您赐教

厄,如果对字符编码没概念的话,解释起来很麻烦。
result.getBytes() 是 new String(byte[]) 的逆过程。
前面那个是 String->byte[] ,后面那个是 byte[] -> String.
在java运行时的时候,String与String是没有区别的都是以2字节的unicode的形式存在内存中,所谓编码,是针对把String转换成 byte[]而言的。比如我可以把 "abc" 通过 utf-8转换成了一串数据 A ,也可以通过gb2312转换成另一串数据 B,这个过程就是 String.getBytes(),比如 "abc".getBytes("utf-8")得到A , "abc".getBytes("gb2312")得到B。如果是"abc".getBytes(),就不知道用的什么编码了,这和平台相关。
那如何从A串或者 B串重新得到String呢,那就是 new String(A,"utf-8") 或者 new String(B,"gb2312")。因为A是从utf-8转换得到的,所以用utf-8转回String ,如果new String(A,"gb2312"), 那么其中的中文就是乱码。
当然gbk和utf-8的有小部分编码集合是一样的,所以英文字符,一般不管怎么转都可以歪打正着。

另外,因为网络传输肯定是用byte[]的,不可能直接把String对象给传过来,所以server想把某个字符串传给client之前,需要将他转成byte[] , 这中间就用了server指定的一种编码,client在收到这个 byte[]之后,就必须要采用和server相同的编码,把byte[]重新转换为String。这就是InputStreamReader需要指定一个编码的原因。
InputStreamReader作用就是在通过inputStream读到byte[]的同时,将byte[]用指定的编码,转换为 char[],也就是实际上的String.
说了一大堆,不知道这表达的你能不能明白



我明白您的意思了
Java代码 复制代码 收藏代码
  1. result = new String(result.getBytes(),"UTF-8");
这段代码是确实有问题,我在调试的时候也感觉到了这个问题,就是没弄明白其中机制。非常感谢melode11详细讲解,向您致敬!高手!
这句话确实是多余的,按照您的意思client已经按照默认编码进行转换了。再次感谢melode11以后请多多关照。
9 楼 melode11 2009-11-22 引用
melode11 写道
bashenmail 写道
melode11 写道
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。

Java代码 复制代码 收藏代码
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同吗?还请您赐教

厄,如果对字符编码没概念的话,解释起来很麻烦。
result.getBytes() 是 new String(byte[]) 的逆过程。
前面那个是 String->byte[] ,后面那个是 byte[] -> String.
在java运行时的时候,String与String是没有区别的都是以2字节的unicode的形式存在内存中,所谓编码,是针对把String转换成 byte[]而言的。比如我可以把 "abc" 通过 utf-8转换成了一串数据 A ,也可以通过gb2312转换成另一串数据 B,这个过程就是 String.getBytes(),比如 "abc".getBytes("utf-8")得到A , "abc".getBytes("gb2312")得到B。如果是"abc".getBytes(),就不知道用的什么编码了,这和平台相关。
那如何从A串或者 B串重新得到String呢,那就是 new String(A,"utf-8") 或者 new String(B,"gb2312")。因为A是从utf-8转换得到的,所以用utf-8转回String ,如果new String(A,"gb2312"), 那么其中的中文就是乱码。
当然gbk和utf-8的有小部分编码集合是一样的,所以英文字符,一般不管怎么转都可以歪打正着。

另外,因为网络传输肯定是用byte[]的,不可能直接把String对象给传过来,所以server想把某个字符串传给client之前,需要将他转成byte[] , 这中间就用了server指定的一种编码,client在收到这个 byte[]之后,就必须要采用和server相同的编码,把byte[]重新转换为String。这就是InputStreamReader需要指定一个编码的原因。
InputStreamReader作用就是在通过inputStream读到byte[]的同时,将byte[]用指定的编码,转换为 char[],也就是实际上的String.
说了一大堆,不知道这表达的你能不能明白
8 楼 melode11 2009-11-22 引用
bashenmail 写道
melode11 写道
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。

Java代码 复制代码 收藏代码
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同吗?还请您赐教

厄,如果对字符编码没概念的话,解释起来很麻烦。
result.getBytes() 是 new String(byte[]) 的逆过程。
前面那个是 String->byte[] ,后面那个是 byte[] -> String.
在java运行时的时候,String与String是没有区别的都是以2字节的unicode的形式存在内存中,所谓编码,是针对把String转换成 byte[]而言的。比如我可以把 "abc" 通过 utf-8转换成了一串数据 A ,也可以通过gb2312转换成另一串数据 B,这个过程就是 String.getBytes(),比如 "abc".getBytes("utf-8")得到A , "abc".getBytes("gb2312")得到B。如果是"abc".getBytes(),就不知道用的什么编码了,这和平台相关。
那如何从A串或者 B串重新得到String呢,那就是 new String(A,"utf-8") 或者 new String(B,"gb2312")。因为A是从utf-8转换得到的,所以用utf-8转回String ,如果new String(A,"gb2312"), 那么其中的中文就是乱码。
当然gbk和utf-8的有小部分编码集合是一样的,所以英文字符,一般不管怎么转都可以歪打正着。
7 楼 bashenmail 2009-11-21 引用
eleda 写道
melode11 写道
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。

嗯,这段的确有问题!
如果系统的默认编码是utf-8还好。
如果不是的话,result = new String(result.getBytes(),"UTF-8"); 这句就是乱码的源泉!


您说的对,我是把GB2312转换成UTF-8的,要不也不会出现乱码,可能是我表达不清
6 楼 bashenmail 2009-11-21 引用
melode11 写道
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。

Java代码 复制代码 收藏代码
  1. result = new String(result.getBytes(),"UTF-8"); 和result.getBytes("utf-8")
有什么不同吗?还请您赐教
5 楼 eleda 2009-11-18 引用
melode11 写道
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。

嗯,这段的确有问题!
如果系统的默认编码是utf-8还好。
如果不是的话,result = new String(result.getBytes(),"UTF-8"); 这句就是乱码的源泉!
4 楼 melode11 2009-11-17 引用
result = new String(result.getBytes(),"UTF-8"); 这句莫名其妙的。
如果源真的是GB2312,那么InputStreamReader读入的已经是正确的值了。
如果想要把result按utf-8编码存到某文件, 那么 result.getBytes("utf-8")得到字节数组,再写入 outputStream才是对的。
3 楼 bashenmail 2009-11-16 引用
changsir 写道
收藏,仔细研究。谢谢楼主分享!

不敢当,也许会有更好的办法呢
2 楼 changsir 2009-11-16 引用
收藏,仔细研究。谢谢楼主分享!
1 楼 syluke 2009-11-03 引用
多谢分享!你的代码解决了我的问题。受教了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多