我是靠谱客的博主 饱满服饰,最近开发中收集的这篇文章主要介绍java os.write乱码_java 乱码问题分析 - dohkoos的专栏 - CSDNBlog,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java 采用unicode 编码来处理字符。Java 程序无论是从/往文件系统以字符流读/写文件,还是往URL 连接写 HTML 信息,或从URL 连接读取参数值,都会有字符编码的转换。编/解码过程如下图:

487208_1.jpg

乱码产生的根源是由于编码和解码采用的不是同一种码(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") 就会产生乱码。

487208_2.jpg

因为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

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

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

System.out.print(Integer.toHexString((iso88591[i])) + " ");

System.out.println(new String(iso88591));        // 123?

byte[] gbk = str.getBytes("gbk");

for (int i=0; i

System.out.print(Integer.toHexString((gbk[i])) + " ");

System.out.println(new String(gbk));        // 123你

} catch (Exception e) {

e.printStackTrace();

}

}

}

最后

以上就是饱满服饰为你收集整理的java os.write乱码_java 乱码问题分析 - dohkoos的专栏 - CSDNBlog的全部内容,希望文章能够帮你解决java os.write乱码_java 乱码问题分析 - dohkoos的专栏 - CSDNBlog所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部