A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

rainforestking

中级黑马

  • 黑马币:0

  • 帖子:41

  • 精华:0

© rainforestking 中级黑马   /  2013-12-26 18:04  /  747 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近做黑马基础测试时遇到了一个乱码问题,是关于gbk转utf-8的,相关问题的帖子地址如下:[url=gbk转unicode乱码问题 http://bbs.itheima.com/thread-103661-1-1.html (出处: 黑马程序员训练营论坛)]gbk转unicode乱码问题 http://bbs.itheima.com/thread-103661-1-1.html (出处: 黑马程序员训练营论坛)[/url],在网上搜索了半天,也没找到解决方案,但是在知乎(知乎网站:www.zhihu.com,这网站真心不错,检索系统太强大了!)上找到了一篇关于编码问题的回答,感觉很不错,贴出来与大家分享(版权归原作者所有!)
首先明确几点:

  1. unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,就仅仅是一种一对一的映射而已,可以理解成一个很大的对应表格
  2. GBK、UTF-8是一种“编码格式”,是用来序列化或存储1中提到的那个“编号(数字)”的一种“格式”;GBK和UTF-8都是用来序列化或存储unicode编码的数据的,但是分别是2种不同的格式; 他们俩除了格式不一样之外,他们所关心的unicode编码范围也不一样,utf-8考虑了很多种不同国家的字符,涵盖整个unicode码表,所以其存储一个字符的编码的时候,使用的字节长度也从1字节到4字节不等;而GBK只考虑中文——在unicode中的一小部分——的字符,的编码,所以它算好了只要2个字节就能涵盖到绝大多数常用中文(2个字节能表示6w多种字符),所以它存储一个字符的时候,所用的字节长度是固定的;
  3. 上述2个概念不懂的请马上google,下面不再赘述;我下面说说这个问题本身...的问题在哪里
  4. 首先java的string使用的编码是unicode,但是,当string存在于内存中时(也就是当程序运行时、你在代码中用string类型的引用对它进行操作时、也就是string没有被存在文件中且也没有在网络中传输(序列化)时),是“只有编码而没有编码格式的”,所以java程序中的任何String对象,说它是gbk还是utf-8都是错的,gbk和utf-8是编码格式而不是编码,String在内存中不需要“编码格式”(记住编码格式是在存文件或序列化的时候使用的), 它只是一个unicode的字符串而已
  5. 所以java里面String是不带编码格式的,而String.toByteArray(charsetName)得到的byteArray是带编码格式的,格式就是你传入的'charsetName',我们不妨把toByteArray的这个过程叫做“编码”;另外,new String(byte[], charsetName)是把一个byte数组(带编码格式)以charsetName指定的编码格式翻译为一个不带编码格式的String对象,我们不妨把这个过程叫“解码”
  6. 那么根据我揣测提问者的意图,可能有2种问法是他真正想问的:
  7. 第一,如何把一个被错误地当作是gbk格式存储的utf-8格式的文件里面读出来的一段乱码字符串还原回去(也就是说本来二

  1. 进制数据是utf-8的,你用gbk来解码它,得到的字符串是乱码,现在想要还原回去)
  2. 第二种,如何把一个gbk文件转化为utf-8文件
  3. 如果是第一种意图那就:

public static void main(String... args) throws Throwable {
String errStr = "errStr";
System.out.println(recover(errStr));
}

public static String recover(String str) throws Throwable {
return new String(str.getBytes("GBK"), "UTF-8");
}
其中errStr就是乱码字符串,按照相反的顺序在编码(用gbk)、解码(用utf-8)回去,就能得到正确的字符串(其实不保证所有情况均能正确还原,只能说大部分都能,要看你在乱码过程中是否有数据被丢失)

如果是第二种意图,那就用InputStream以gbk格式将文件读到内存里(表示为String),再将这个String以UTF-8编码写入目标文件里,具体请参考InputStream/OutputStream的api  

原文地址:http://www.zhihu.com/question/20361462


评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马