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

MarkZar 2012-04-07 02:58:35
首先,工作环境是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吗
...全文
1538 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 17 楼 huntor 的回复:
[Quote=引用 15 楼 的回复:] 要先转成 iso-8859-1 格式, 然后再转 UTF-8 return new String(str.getBytes("iso-8859-1"), "utf-8"); 没有API,只能自己写 [/Quote] 不要无视 java.nio.charset包提供的类
你倒是说个解决方法啊
a1018615265 2012-10-17
  • 打赏
  • 举报
回复
我只想大声的说一句,编码问题,很头痛……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
request.set
response.set
没多大用,不知道传的数据在哪被改了
还有他吗的MYSQL明明装的时候选了gbk,他吗的,存进去还是乱码,数据库连接给定了?useUnicode=true&characterEncoding = gbk存进去的数据还是乱码,我现在都不想用gbk了,尤其是,浏览器居然还默认用UTF8来作解析,啥都不能说了,用utf8吧,省事
huntor 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

要先转成 iso-8859-1 格式, 然后再转 UTF-8

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

没有API,只能自己写
[/Quote]
不要无视 java.nio.charset包提供的类
gegaosong 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

要先转成 iso-8859-1 格式, 然后再转 UTF-8

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

没有API,只能自己写
[/Quote]

正解
wu209000 2012-05-17
  • 打赏
  • 举报
回复
要先转成 iso-8859-1 格式, 然后再转 UTF-8

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

没有API,只能自己写
zwnylsf 2012-05-17
  • 打赏
  • 举报
回复
比如:你先用GBK先把中文在程序中读出来,用String保存,再调用getBytes()方法指定为utf-8不就行了吗,程序里将字符都还原出来,就可以重新编码,没问题的
Sky牟天 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

楼上的还上google一下吧,谁说gbk是16位的?全是汉字的话我相信,字母的汉字混排的话就难说了。
[/Quote]
没错的,双字节编码,16位,有什么问题?百度,谷歌都没问题
ljhhh0123 2012-05-16
  • 打赏
  • 举报
回复
楼上的还上google一下吧,谁说gbk是16位的?全是汉字的话我相信,字母的汉字混排的话就难说了。
Sky牟天 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

InputStreamReader和InputStreamWrite类的第二个参数可以指定字符编码方式.
来源于:http://blog.csdn.net/qq675927952/article/details/6359196
http://blog.csdn.net/smartcat86/article/details/4085739/
希望对你有用。
我的疑问是:unicode编码的……
[/Quote]
咳咳,unicode是16位的,gbk也是16位的哟
ljhhh0123 2012-05-16
  • 打赏
  • 举报
回复
InputStreamReader和InputStreamWrite类的第二个参数可以指定字符编码方式.
来源于:http://blog.csdn.net/qq675927952/article/details/6359196
http://blog.csdn.net/smartcat86/article/details/4085739/
希望对你有用。
我的疑问是:unicode编码的String也能装多字节编码的gbk?
YoonSeokHo 2012-05-16
  • 打赏
  • 举报
回复
楼主找到解决方法了吗 我遇到跟楼主一样的情况 不过我的项目要部署到AIX上
冰思雨 2012-04-08
  • 打赏
  • 举报
回复
楼主对字符的编码,理解的可能不太到位。
编码其实,就是二进制数,与字符的映射关系。
那么,它只和二进制数和字符有关。
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语言的字符(串)型的数据,供编程人员使用。
啤酒沫 2012-04-08
  • 打赏
  • 举报
回复
更正一下,System.out.print输出的时候应该是采用系统缺省字符集进行转换的,而不是缺省采用Unicode。可以通过虚拟机的启动参数来指定。
啤酒沫 2012-04-08
  • 打赏
  • 举报
回复
不好意思,我的输入法有些不好用。上面的文字有很多错字和多字。敬请原谅。
啤酒沫 2012-04-08
  • 打赏
  • 举报
回复
先支持一下楼上的说法。楼主根本没弄清楚字符编码方式是个什么东西,在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)的方式。
  • 打赏
  • 举报
回复
上面那个“首先”,我看得是云里雾里的!!!!
  • 打赏
  • 举报
回复
首先,工作环境是linux,linux默认是UTF-8编码,然后要接受网页内容,网页内容存储在str中,用GBK编码,现在的目的是将此GBK编码的str转变为UTF-8编码,在linux下面正确显示

第一个红色部分,我看懂了
第二个红色部分,我想问一下,存储在 str 中怎么会是 GBK 编码呢?Java 中的 str 内部采用的是 unicode 存储的
第三个红色部分,在 Linux 下面。问一下,什么叫 Linux 下面?
  • 打赏
  • 举报
回复
在 Linux, Windows 什么地方显示?说实在的,我根本没看懂。

特别是那三段代码,简直就不知道在写什么,谁跟你说可以这样写的啊?
  • 打赏
  • 举报
回复
乱码是编程很头疼的一个问题

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧