日期:2014-05-20  浏览次数:20875 次

字符串编码问题.
一个字符串,本来就是utf-8编码(utf-8是正确编码),我想转成gbk编码. 然后反之转换回去.
java里有没有函数库提供转换? 


另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样.

------解决方案--------------------
io流里面倒是有几个类可以指定字符集进行转换,例如这个:

PrintWriter(File file, String csn) 
创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
------解决方案--------------------
字符串就是字符串,就是一串 Char 的序列,无所谓什么编码

运行时内存中存储,Java 都是按 Unicode

===============================================

只有当字符串转换成 byte 序列,或者是 byte 序列转化成字符串时,才有涉及到编码

说到底 charset 是一个转换规则, 是转换过程才涉及的

===============================================

“一个字符串,本来就是utf-8编码(utf-8是正确编码)”

把 utf-8 编码规则当成字符串的一种状态了, 注意 charset 是一种规则而不是一种状态

所以这样的表述 很难让人猜中你具体是什么样的实际情况

===============================================

Java 的 String 有 getBytes(charset) 方法, charset 是指定的编码规则
是将字符串转换成 byte[],一般字符串需要通过流传递,都会有这样一个过程。
(这个过程,可能是需要你手动完成,又可能是由底层程序自动完成)

发送方把 String 按一定的规则编码,变成二进制数据(byte[]), charset 就是所使用的规则
接收方 收到了 byte[] 后,使用相同的规则 (charset) 进行逆操作,也就是解码。从而得到正确还原后的 String
如果编码使用的规则(charset) 与解码使用的规则不一致 则导致接收方无法还原字符串,从而得到所谓的 乱码。


str.getBytes(charset) 就是一个编码过程,把字符串转换成 byte 数组, 也就是 byte 序列
new String(bytes, charset) 就是一个解码过程,解码 byte序列, 还原为 String 

正确的运用好这两个功能。
再详细分析一下实际情况,应该可以自己搞惦

如果,还有遇到问题。。 再提出来让大家讨论分析

------解决方案--------------------
另外 new String(xxx.getBytes("utf-8"),"gbk") 这个方法是字符串是gbk编码但是转换错了(转换成utf-8),然后用这个方法转换回来.所以跟我的问题不一样. 

jdk还会为了处理转码错误而特意设置函数?你试试再说!

你想实现什么? java都是unicode的
------解决方案--------------------
这需要 UTF-8 与 GBK 的字符映射表,否则转不了!

不过在 JAVA 中都是采用 Unicode 来表示的。
------解决方案--------------------
楼上几位都说得很对,这里我补充一点,我们常用的工具,例如Tomcat\ecplise等等都是国外的写的,这些工具中的编码,在默认情况下都是ISO8859-1的
------解决方案--------------------
你所说的这种现象是可以通过代码来实现的,我以前在处理这样的事情时把GBK转换成UTF-8都是用代码来处理的。。
------解决方案--------------------
java的字符串都是unicode的。

应该是utf-8 ----> unicode(可以在这里修改) -----> gbk
------解决方案--------------------
友情帮顶!!
------解决方案--------------------
Java code
byte[] utfBytes = new byte[100];
        ....
        try {
            byte[] gbkBytes = new String(utfBytes).getBytes("GBK");
        } catch (UnsupportedEncodingException e) {
        }