Java GBK转UTF8,找遍了整个网络都没找到现成的API,难道只能自己转换?堂堂Java没有一个可以自由转换编码的API? 在 Linux, Windows 什么地方显示?说实在的,我根本没看懂。特别是那三段代码,简直就不知道在写什么,谁跟你说可以这样写的啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先,工作环境是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)的方式。 更正一下,System.out.print输出的时候应该是采用系统缺省字符集进行转换的,而不是缺省采用Unicode。可以通过虚拟机的启动参数来指定。 楼主对字符的编码,理解的可能不太到位。编码其实,就是二进制数,与字符的映射关系。那么,它只和二进制数和字符有关。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语言的字符(串)型的数据,供编程人员使用。 楼主找到解决方法了吗 我遇到跟楼主一样的情况 不过我的项目要部署到AIX上 InputStreamReader和InputStreamWrite类的第二个参数可以指定字符编码方式.来源于:http://blog.csdn.net/qq675927952/article/details/6359196http://blog.csdn.net/smartcat86/article/details/4085739/希望对你有用。我的疑问是:unicode编码的String也能装多字节编码的gbk? 咳咳,unicode是16位的,gbk也是16位的哟 楼上的还上google一下吧,谁说gbk是16位的?全是汉字的话我相信,字母的汉字混排的话就难说了。 比如:你先用GBK先把中文在程序中读出来,用String保存,再调用getBytes()方法指定为utf-8不就行了吗,程序里将字符都还原出来,就可以重新编码,没问题的 要先转成 iso-8859-1 格式, 然后再转 UTF-8return new String(str.getBytes("iso-8859-1"), "utf-8");没有API,只能自己写 不要无视 java.nio.charset包提供的类 我只想大声的说一句,编码问题,很头痛……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………request.setresponse.set没多大用,不知道传的数据在哪被改了还有他吗的MYSQL明明装的时候选了gbk,他吗的,存进去还是乱码,数据库连接给定了?useUnicode=true&characterEncoding = gbk存进去的数据还是乱码,我现在都不想用gbk了,尤其是,浏览器居然还默认用UTF8来作解析,啥都不能说了,用utf8吧,省事 不要无视 java.nio.charset包提供的类你倒是说个解决方法啊 关于java中的闭包和回调的问题 大家帮忙看下这个程序中的几个符号是什么意思! 如何禁用JScrollPane的键盘事件响应? 在JList中增加滚动条 急,在线等!关于文件下载,打开为空 Hashtable和HashMap的区别 一个我觉得很有趣的Java问题 我在一个jtable里更改表的数据可是最后一个单元格更改完就点击保存按钮的问题 Java中synchronized锁问题 汉子转换,请大神赐教!!!! 俩个IO流的题目,大家看看做的不出不、。? 使用TableModel,修改Table数据以后抛出异常
第二个红色部分,我想问一下,存储在 str 中怎么会是 GBK 编码呢?Java 中的 str 内部采用的是 unicode 存储的
第三个红色部分,在 Linux 下面。问一下,什么叫 Linux 下面?
接下来需要把中文存储到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语言的字符(串)型的数据,供编程人员使用。
来源于:http://blog.csdn.net/qq675927952/article/details/6359196
http://blog.csdn.net/smartcat86/article/details/4085739/
希望对你有用。
我的疑问是:unicode编码的String也能装多字节编码的gbk?
request.set
response.set
没多大用,不知道传的数据在哪被改了
还有他吗的MYSQL明明装的时候选了gbk,他吗的,存进去还是乱码,数据库连接给定了?useUnicode=true&characterEncoding = gbk存进去的数据还是乱码,我现在都不想用gbk了,尤其是,浏览器居然还默认用UTF8来作解析,啥都不能说了,用utf8吧,省事