Guide to Character Encoding
该文章主要讨论编码基础以及在Java中如何处理。
重要概念
1、编码:字符对应二进制的映射集合。例如“T”在US-ASCII对应“01010100”。
2、字符集:一系列映射关系的字符。例如ASCII有128字符。
3、代码点:一个对应特指字符的整数。“T“在Unicode对应“U+0054”(它提供了一种将十六进制数字标记为Unicode代码点。“U”表示“Unicode”) (或 在十进制是84)。
编码类型
单字节编码
最著名就是ASCII,通过七位二进制数字来表示字符,一共有128个字符。
ASCII没有充分使用每一个字节,所有就一些扩展编码类型。例如ISO-8859-1,额外包含128格字符个
双字节编码
BIG5和SHIFT-JIS使用双字节方式,可以表示更加广的字符。包含一部分字符。
Unicode
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制码,以满足跨语言、跨平台进行文本转换、处理的要求。
UTF-32
使用四个字节来表示字符,但是会出现很多浪费。例如"T"对应"00000000 00000000 00000000 01010100"
UTF-8
通过不同字节长度来表示不同字符。
"T"对应"01010100"
"語"对应"11101000 10101010 10011110"
Java对编码使用
Java支持需要编码格式,包括它们之间转化。包含US-ASCII, ISO-8859-1, UTF-8, UTF-16。也可以支持其他编码格式。
默认编码格式
JVM在启动时候决定默认编码格式,一般依赖运行系统的编码格式
通过Charset.defaultCharset().displayName();打印出来。
MacOS:UTF-8
Windows:windows-1252
JVM使用默认编码
InputStreamReader和Fileheader
OutputStreamWriter和FileWriter
Formatter和Scanner
URLEncoder和URLDecoder
如何修改默认编码
file.encoding和sun.jnu.encoding
运行启动参数
-Dfile.encoding="UTF-8"
-Dsun.jnu.encoding="UTF-8"