当前位置: 代码迷 >> J2SE >> Java GBK转UTF8,找遍了整个网络都没找出现成的API,难道只能自己转换?堂堂Java没有一个可以自由转换编码的API
  详细解决方案

Java GBK转UTF8,找遍了整个网络都没找出现成的API,难道只能自己转换?堂堂Java没有一个可以自由转换编码的API

热度:60   发布时间:2016-04-23 20:27:39.0
Java GBK转UTF8,找遍了整个网络都没找到现成的API,难道只能自己转换?堂堂Java没有一个可以自由转换编码的API?
首先,工作环境是linux,linux默认是UTF-8编码,然后要接受网页内容,网页内容存储在str中,用GBK编码,现在的目的是将此GBK编码的str转变为UTF-8编码,在linux下面正确显示,下面是网上流行的函数:
private String encodeTransfer() throws UnsupportedEncodingException {
     return new String(str.getBytes("gbk"), "utf-8");
    }


由于str是GBK编码,经过getBytes函数处理后,变为GBK编码的字节串,再将此GBK字节串解码为UTF-8编码的字符串,肯定要出错,事实证明也是这样,结果str是一堆问号
之后,我又试了
private String encodeTransfer() throws UnsupportedEncodingException {
     return new String(str.getBytes("gbk"), "gbk");
    }

private String encodeTransfer() throws UnsupportedEncodingException {
     return new String(str.getBytes("utf-8"), "utf-8");
    }

private String encodeTransfer() throws UnsupportedEncodingException {
     return new String(str.getBytes("utf-8"), "gbk");
    }

均无效,难道只能手动编一个函数转?Java没有一个能自由转换编码的API吗
------解决方案--------------------
首先,工作环境是linux,linux默认是UTF-8编码,然后要接受网页内容,网页内容存储在str中,用GBK编码,现在的目的是将此GBK编码的str转变为UTF-8编码,在linux下面正确显示

第一个红色部分,我看懂了
第二个红色部分,我想问一下,存储在 str 中怎么会是 GBK 编码呢?Java 中的 str 内部采用的是 unicode 存储的
第三个红色部分,在 Linux 下面。问一下,什么叫 Linux 下面?
------解决方案--------------------
先支持一下楼上的说法。楼主根本没弄清楚字符编码方式是个什么东西,在Java种怎么运作的。这样的话即使你自己写什么转换函数估计也是一团浆糊。下面我来小说一下。

谈到字符集编码,我们首先要面对的是一串二进制数组,在楼主的案例中是通过浏览器提交上来的。并且在浏览器组织HTTP Request数据流的时候采用的是GBK编码方式对Request Body中的中文进行编码生成一串二进制代码。应用服务器收到后一般实在第一次使用request.getParameter方法时将这串二进制数组转化为String对象。这里需要指定字符的编码方式否则会出现乱码。假设应用服务器是Tomcat,如果不指定编码方式Tomcat会缺省采用ISO8859-1的方式进行解码。所以一般我们会建立一个Mapping到\*上的ServletFilter,在其中写上request.setChatsetEncodeing(“GBK”)(方法名可能有错,我记不太清楚)的方式来指定浏览器提交上来的中文采用的是哪种字符集编码。这是处理中文的第一环节。
接下来需要把中文存储到String中去。那么在String中是如何存储的呢?其实仍然是二进制数组(用Character表示)。这里也存在一个字符集编码的问题。Java统一采用Unicode编码方式,无论所运行的操作系统是Linux还是Windows。这是第二个环节。
下面该到输出环节了。到这里我就不是很清楚楼主说的在Linux下显示是什么意思。假设我们往文件系统输出,那么需要通过FileOutputStream.write(String.getBytes("UTF-8"));就可以写成一个UTF-8是个的文本文件了。加入需要往System.out.print输出那么如果会直接使用Unicode作为编码方式,如果你的out重定向了那么需要看响应的查看器是如何对二进制数组解码的。如果你确定查看器采用UTF-8方式解码,那么使用Unicode输出也可以看到中文,但有些宽字符是会出错的。最好采用System.out.write(String.getBytes("UTF8"),0,length)的方式。

------解决方案--------------------
楼主对字符的编码,理解的可能不太到位。
编码其实,就是二进制数,与字符的映射关系。
那么,它只和二进制数和字符有关。
Java内存中的字符(字符串),都是Unicode编码的。
所以,当你的二进制数是GBK编码的时候,首先要用解码器将GBK转换成Unicode编码,然后再保持到字符当中。
也就是说,你应该先得到二进制数据:byte [] data = ...;
然后,生成字符串:String str = new String(data,"GBK");
这样,这个字符串就可以正常显示了。
如果,输出的数据,要UTF-8编码的,那么,应该是这样:byte [] outData = str.getBytes("UTF-*");
然后,out.write(outData);将数据写入的IO当中。

不应该出现楼主那种变态的写法:new String(str.getBytes("gbk"), "utf-8");
这种写法,很变态,一般都是对字符数据编码理解得不透彻,才这么写的。
编码编的是二进制数据,编码后,二进制数据(字节流或字节数组)会转换成Java语言的字符(串)型的数据,供编程人员使用。

------解决方案--------------------
引用:
要先转成 iso-8859-1 格式, 然后再转 UTF-8

return new String(str.getBytes("iso-8859-1"), "utf-8");

没有API,只能自己写

不要无视 java.nio.charset包提供的类
  相关解决方案