本站首页    管理页面    写新日志    退出


«January 2026»
123
45678910
11121314151617
18192021222324
25262728293031


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:29
评论数量:19
留言数量:0
访问次数:118490
建立时间:2006年5月29日




[java与中文]乱码问题 
软件技术

krf301 发表于 2007/4/16 20:31:14

java 采用unicode 编码来处理字符。Java 程序无论是从/往文件系统以字符流读/写文件,还是往URL 连接写 HTML 信息,或从URL 连接读取参数值,都会有字符编码的转换。编/解码过程如下图:  500)this.width=500'> 乱码产生的根源是由于编码和解码采用的不是同一种码(gbk,utf-8,iso8859-1)。 字符串(String 或char[])"123你" 经过java 编码后的字节流(unicode 字节流)为31 00 32 00 33 00 60 4f。如果你用new String("123你".getBytes("iso8859-1"), "gbk") 就会产生乱码。 500)this.width=500'> 因为getBytes("iso8859-1") 取得的是"123你" 经过iso8859-1 编码后的字节流31 32 33 3f(iso8859字节流),而在用new String(bytes, "gbk") 构造字符串时java 则将iso8859字节流(31 32 33 3f)当作是unicode 字节流(因为java 是采用unicode 来处理字符的,所以它把字节流统统当作是unicode 字节流),因此它把31 32 33 3f 也看成是unicode 字节流。而unicode 字节流(31 32 33 3f)经过gbk 编码后当然是123? 了。于是,乱码产生了。下面的是一个测试程序: public class Charset {     public static void main(String[] args) {        String str = "123你";         try {            byte[] unicode = str.getBytes("unicode");            for (int i=0; i<unicode.length; i++)                System.out.print(Integer.toHexString(unicode[i]) + " ");            System.out.println(new String(unicode));        // ??1 2 3 `O             byte[] utf8 = str.getBytes("utf-8");            for (int i=0; i<utf8.length; i++)                System.out.print(Integer.toHexString((utf8[i])) + " ");            System.out.println(new String(utf8));        // 123浣?             byte[] iso88591 = str.getBytes("iso8859-1");            for (int i=0; i<iso88591.length; i++)                System.out.print(Integer.toHexString((iso88591[i])) + " ");            System.out.println(new String(iso88591));        // 123?             byte[] gbk = str.getBytes("gbk");            for (int i=0; i<gbk.length; i++)                System.out.print(Integer.toHexString((gbk[i])) + " ");            System.out.println(new String(gbk));        // 123你         } catch (Exception e) {            e.printStackTrace();        }    }} 以下为编码转换方式: msg = new String(msg.getBytes("GBK"), "ISO8859-1");msg = new String(msg.getBytes("ISO8859-1"), "GBK");


阅读全文(1233) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144807008 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号