| « | January 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
| 公告 |
| 暂无公告... |
| 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"); |
|
|