Java 与文字编码
-
字符编码(维基百科)
字符编码就是将字符集中的字符转换为一种统一的表达方式,以便在计算机中进行存储和传输。
其中ASCII
、EBCDIC
,以及中国的GBK
、GB 2312
都属于字符编码。由于世界上字符编码众多,不同国家不同地区都有不同的编码,这十分不方便计算机的国际化和本地化,所以出现了Unicode
。 -
Unicode编码表(维基百科)
Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。
在
Unicode
中,字符采用十六进制书写,并加上前缀U+
,如U+0041
就是字母A的代码点(编码表中字符对应的编码值)。Unicode
分为了17个平面:Unicode层面
其中第一个层面包含基本的Unicode代码,代码点从U+0000
到U+ffff
。另外16个平面代码点从U+010000
到U+10ffff
,其中包含了一些辅助字符。 -
UTF(Unicode Transformation Format)
UTF被称为Unicode 转换格式,属于
Unicode
的实现方式,其中包括UTF-7
、UTF-8
、UTF-16
和UTF-32
。UTF-8
以8位为单元对通用字符集(由ISO制定的ISO 10646
(或称ISO/IEC 10646
)标准所定义的标准字符集。)进行编码。Unicode 和 UTF-8 之间的转换关系表 ( x 字符表示码点占据的位 )
ASCII字母继续使用1字节存储,重音文字、希腊字母或西里尔字母等使用2字节来存储,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。UTF-16
以16位为一个单元对通用字符集进行编码。第一个Unicode平面(码位从U+0000至U+FFFF)包含了最常用的字符。UTF-16编码这个范围内的码位为16位的单个码元,数值等价于对应的码位。辅助平面(Supplementary Planes)中的码位,在UTF-16中被编码为一对16位长的码元。 -
Java的文字编码
Java编程语言中,
char
类型用于表示一个字符。Java中,char
类型使用UTF-16
编码描述码元。下面的例子中,我们将字符串输出到文件中,然后使用文档编辑器打开文件,看一下需要使用什么编码才能正常显示try(FileOutputStream fileOutputStream = new FileOutputStream("test.txt"); DataOutputStream outputStream = new DataOutputStream(fileOutputStream)){ outputStream.writeChars("一个中文字符串"); }catch (IOException e){ e.printStackTrace(); }
使用编辑器打开
test.txt
,发现只有使用utf-16
编码才能正常显示内容。由此可见,java默认使用utf-16
编码描述码元。但是在Java编程中,不推荐使用
char
类型,通常使用的是String
。通过java.nio.charset.Charset
类对一个字符串进行编码或对一个字节序列进行解码://编码 Charset charset = Charset.forName("utf-8"); //获得一个指定编码的字符集 byte[] result = charset.encode("一个字符串内容").array(); //解码 ByteBuffer byteBuffer = ByteBuffer.wrap(reslut); CharBuffer charBuffer = charset.decode(byteBuffer); String str = charBuffer.toString();