java中字符串编解码的问题

1. Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。

Java的char类型,通常以UTF-16 Big Endian的方式保存一个字符。

2. 对于字符串String s = "你好世界";

如果源码文件是GBK编码, 操作系统(windows)默认的环境编码为GBK,那么编译时,  JVM将 按照GBK

编码将字节数组解析成字符,然后将字符转换为unicode格式的字节数组,作为内部存储。当打印这个字符串时,

JVM 根据操作系统本地的语言环境,将unicode转换为GBK,然后操作系统将GBK格式的内容显示出来。

当源码文件是UTF-8, 我们需要通知编译器源码的格式,javac -encoding utf-8 ... , 编译时,JVM按照utf-8

 解析成字符,然后转换为unicode格式的字节数组, 那么不论源码文件是什么格式,同样的字符串,最后得到的

unicode字节数组完全一致的,显示的时候,也是转成GBK来显示(跟OS环境有关)

 乱码如何产生? 本质上都是由于 字符串原本的编码格式 与 读取时解析用的编码格式不一致导致的。

String s  = "你好世界";

System.out.println(new String(s.getBytes(), "utf-8"));

注:这条输出语句会报错,因为getBytes()默认使用GBK编码,而解析时使用的UTF-8编码。

关于String(byte bytes[], String charsetName)

这里s.getBytes()可以将unicode 转换为操作系统默认的格式的字节数组,即gbk格式的s。

charset 是指定读取 bytes 的方式,这里指定为utf-8,即把bytes的内容当做utf-8来对待。






你可能感兴趣的:(java语言)