Shift_JIS
是一个日本电脑系统常用的编码表。它能容纳全角及半角拉丁字母、平假名、片假名、符号及日语汉字。它被命名为Shift_JIS的原因,是它在放置全角字符时,要避开原本在0xA1-0xDF放置的半角假名字符。
Shift_JIS | ||||||||||||||||
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
1x | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
2x | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
3x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4x | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5x | P | Q | R | S | T | U | V | W | X | Y | Z | [ | ¥ | ] | ^ | _ |
6x | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7x | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ‾ | DEL |
8x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9x |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ax |
| 。 | 「 | 」 | 、 | ・ | ヲ | ァ | ィ | ゥ | ェ | ォ | ャ | ュ | ョ | ッ |
Bx | ー | ア | イ | ウ | エ | オ | カ | キ | ク | ケ | コ | サ | シ | ス | セ | ソ |
Cx | タ | チ | ツ | テ | ト | ナ | ニ | ヌ | ネ | ノ | ハ | ヒ | フ | ヘ | ホ | マ |
Dx | ミ | ム | メ | モ | ヤ | ユ | ヨ | ラ | リ | ル | レ | ロ | ワ | ン | ゙ | ゚ |
Ex |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Fx |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
上图粉红色为JIS X 0207定义的控制字符;浅蓝色为JIS X 0201一字节符号的所在范围;紫色为JIS X 0208两字节汉字和全角符号的所在范围;黄色为JIS X 0201以“¥”替换了“\”、以“‾”替换了“~”;绿色为未编码。
GB 2312 或 GB 2312-80
是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
分区表示
GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
10-15区及88-94区则未有编码。
举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。
字节结构
在使用GB2312的程序通常采用EUC储存方法,以便兼容于ASCII。浏览器编码表上的“GB2312”,通常都是指“EUC-CN”表示法。
每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。 由于一级汉字从16区起始,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。
Big5
又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字[1]。
中文码分为内码及交换码两类,Big5属中文内码,知名的中文交换码有CCCII、CNS11643。
字节结构
Big5码是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE。在Big5的分区中:
0x8140-0xA0FE | 保留给用户自定义字符(造字区) |
0xA140-0xA3BF | |
0xA3C0-0xA3FE | 保留。此区没有开放作造字区用。 |
0xA440-0xC67E | |
0xC6A1-0xC8FE | 保留给用户自定义字符(造字区) |
0xC940-0xF9D5 | 次常用汉字,亦是先按笔划再按部首排序。 |
0xF9D6-0xFEFE | 保留给用户自定义字符(造字区) |
值得留意的是,Big5重复收录了两个相同的字:“兀、兀”(0xA461[U+5140]及0xC94A[U+FA0C])、“嗀、嗀”(0xDCD1[U+55C0]及0xDDFC[U+FA0D])。此外“十”、“卅”也在符号区又重复了一次,在检索系统中常会造成查询不到字。
GBK
即汉字内码扩展规范,K为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母。英文全称Chinese Internal Code Specification。 GBK编码是按读音排序的。
编码方式
字符有一字节和双字节编码,00
–7F
范围内是一位,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。
之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81
–FE
(也就是不含80
和FF
),第二字节的一部分领域在40
–7E
,其他领域在80
–FE
。
具体来说,定义的是下列字节:
GBK的编码范围 | ||||
范围 | 第1字节 | 第2字节 | 编码数 | 字数 |
水准 GBK/1 | A1–A9 | A1–FE | 846 | 717 |
水准 GBK/2 | B0–F7 | A1–FE | 6,768 | 6,763 |
水准 GBK/3 | 81–A0 | 40–FE (7F除外) | 6,080 | 6,080 |
水准 GBK/4 | AA–FE | 40–A0 (7F除外) | 8,160 | 8,160 |
水准 GBK/5 | A8–A9 | 40–A0 (7F除外) | 192 | 166 |
用户定义 | AA–AF | A1–FE | 564 | |
用户定义 | F8–FE | A1–FE | 658 | |
用户定义 | A1–A7 | 40–A0 (7F除外) | 672 | |
合计: | 23,940 | 21,886 |
双字节符号可以表达的64K空间如下图所示。绿色和黄色区域是GBK的编码,红色是用户定义区域。没有颜色区域是不正确的代码组合。
中华人民共和国国家质量技术监督局于2000年3月17日推出了GB 18030-2000标准,以取代GBK。GB 18030-2000除保留全部GBK编码汉字,在第二字节把能使用范围再度进行扩展,增加了大约一百个汉字及四位元组编码空间,但是将GBK作为子集全部保留。请参看GB 18030
GB 18030
最新版本为GB 18030-2005,其全称为中华人民共和国国家标准GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,是GB 18030-2000《信息技术 信息交换用汉字编码字符集基本集的扩充》的修订版。与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。
GB 18030主要有以下特点:
- 字汇
此标准收录的字符以单字节、双字节或四字节编码。
· 单字节部分
此标准中,单字节的部分收录了GB/T 11383-1989的0x00到0x7F全部128个字符。
· 双字节部分
此标准中,双字节的部分收录内容如下:
· GB 13000.1-1993的全部CJK统一汉字字符。
· GB 13000.1-1993的CJK兼容区中的21个汉字。
· GB 13000.1-1993中收录而GB 2312未收录的台湾使用的图形字符139个。
· GB 13000.1-1993收录的其他字符31个。
· GB 2312-1980中的非汉字标点。
· GB 12345-1980的竖排标点符号19个。
· GB 2312-1980未收录的10个小写罗马数字。
· GB 2312-1980未收录的带音调的汉语拼音字母5个以及a和g。
· 汉字数字“〇”。
· 表意文字描述符13个。
· 对GB 13000.1-1993增补的汉字和部首/构件80个。
· 双字节编码的欧元符号。
· 四字节部分
此标准的四字节的部分,收录了上述双字节字符之外的,GB 13000的CJK统一汉字扩充A、CJK统一汉字扩充B和已经在GB 13000中编码的中国少数民族文字的字符。
- 总体结构
此标准中,采用单字节、双字节或四字节对字符编码。此标准中的任何一个字节由八位二进制位串组成,任何一个八位的值均由0x00至0xFF的十六进制计数法表示。此标准中,凡数字前标有0x的表示采用十六进制,未标有0x的表示采用十进制。
· 单字节部分采用GB/T 11383-1989的编码结构与规则,使用0x00至0x7F码位。
· 双字节部分采用两个八位二进制位串表示一个字符,其首字节码位从0x81至0xFE,尾字节码位分别是0x40至0x7E和0x80至0xFE。 也就是 GBK。
· 四字节部分采用GB/T 11383-1989未采用的0x30至0x39作为对双字节编码的扩充的后缀。这样扩充的四字节编码,其范围为0x81308130到0xFE39FE39。四字节字符的第一个字节的编码为0x81至0xFE;第二个字节的编码范围为0x30至0x39;第三个字节编码范围为0x81至0xFE;第四个字节编码范围为0x30至0x39。
ISO 8859-1
正式编号为ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。
此字符集支援部分于欧洲使用的语言,包括阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语。
ISO/IEC 8859-1 | ||||||||||||||||
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | ||||||||||||||||
1x | ||||||||||||||||
2x | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
3x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4x | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5x | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6x | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7x | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | |
8x | ||||||||||||||||
9x | ||||||||||||||||
Ax | NBSP | ¡ | ¢ | £ | ¤ | ¥ | ¦ | § | ¨ | © | ª | « | ¬ | SHY | ® | ¯ |
Bx | ° | ± | ² | ³ | ´ | µ | ¶ | · | ¸ | ¹ | º | » | ¼ | ½ | ¾ | ¿ |
Cx | ||||||||||||||||
Dx | ||||||||||||||||
Ex | ||||||||||||||||
Fx | ÷ |
在上表中,0x20是空格、0xA0是不换行空格、0xAD是选择性连接号。
0x00-0x1F、0x7F、0x80-0x9F在此字符集中未有定义。
EBCDIC
(Extended Binary Coded Decimal Interchange Code) 扩增二进式十进交换码,为IBM于1963年-1964年间推出的字符编码表,根据早期打孔机式的二进化十进数(BCD,Bindary Coded Decimal)排列而成。是IBM迷尔级以上电脑的标准码。
字符对应
EBCDIC编码表本来有58个字符,如下图灰色底所示。后来于各版本的编码表中,加入了其他字符,以符合各地使用者所需。
以下是其中两个版本的EBCDIC编码表:CP037(英语)及CP500(多语言#5)。
EBCDIC CP037 | ||||||||||||||||
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | NUL | SOH | STX | ETX | ST | HT | SSA | DEL | EPA | RI | SS2 | VT | FF | CR | SO | SI |
1x | DLE | DC1 | DC2 | DC3 | OSC | NEL | BS | ESA | CAN | EM | PU2 | SS3 | FS | GS | RS | US |
2x | PAD | HOP | BPH | NBH | IND | LF | ETB | ESC | HTS | HTJ | VTS | PLD | PLU | ENQ | ACK | BEL |
3x | DCS | PU1 | SYN | STS | CCH | MW | SPA | EOT | SOS | SGCI | SCI | CSI | DC4 | NAK | PM | SUB |
4x | SP | NBSP | â | ä | à | á | ã | å | ç | ñ | ¢ | . | < | ( | + | | |
5x | & | é | ê | ë | è | í | î | ï | ì | ß | ! | $ | * | ) | ; | ¬ |
6x | - | / | Â | Ä | À | Á | Ã | Å | Ç | Ñ | ¦ | , | % | _ | > | ? |
7x | ø | É | Ê | Ë | È | Í | Î | Ï | Ì | ` | : | # | @ | ' | = | " |
8x | Ø | a | b | c | d | e | f | g | h | i | « | » | ð | ý | þ | ± |
9x | ° | j | k | l | m | n | o | p | q | r | ª | º | æ | ¸ | Æ | ¤ |
Ax | µ | ~ | s | t | u | v | w | x | y | z | ¡ | ¿ | Ð | Ý | Þ | ® |
Bx | ^ | £ | ¥ | · | © | § | ¶ | ¼ | ½ | ¾ | [ | ] | ¯ | ¨ | ´ | × |
Cx | '{' | A | B | C | D | E | F | G | H | I | SHY | ô | ö | ò | ó | õ |
Dx | '}' | J | K | L | M | N | O | P | Q | R | ¹ | û | ü | ù | ú | ÿ |
Ex | \ | ÷ | S | T | U | V | W | X | Y | Z | ² | Ô | Ö | Ò | Ó | Õ |
Fx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ³ | Û | Ü | Ù | Ú | APC |
EBCDIC CP500 | ||||||||||||||||
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | NUL | SOH | STX | ETX | ST | HT | SSA | DEL | EPA | RI | SS2 | VT | FF | CR | SO | SI |
1x | DLE | DC1 | DC2 | DC3 | OSC | NEL | BS | ESA | CAN | EM | PU2 | SS3 | FS | GS | RS | US |
2x | PAD | HOP | BPH | NBH | IND | LF | ETB | ESC | HTS | HTJ | VTS | PLD | PLU | ENQ | ACK | BEL |
3x | DCS | PU1 | SYN | STS | CCH | MW | SPA | EOT | SOS | SGCI | SCI | CSI | DC4 | NAK | PM | SUB |
4x | SP | NBSP | â | ä | à | á | ã | å | ç | ñ | [ | . | < | ( | + | ! |
5x | & | é | ê | ë | è | í | î | ï | ì | ß | ] | $ | * | ) | ; | ^ |
6x | - | / | Â | Ä | À | Á | Ã | Å | Ç | Ñ | ¦ | , | % | _ | > | ? |
7x | ø | É | Ê | Ë | È | Í | Î | Ï | Ì | ` | : | # | @ | ' | = | " |
8x | Ø | a | b | c | d | e | f | g | h | i | « | » | ð | ý | þ | ± |
9x | ° | j | k | l | m | n | o | p | q | r | ª | º | æ | ¸ | Æ | ¤ |
Ax | µ | ~ | s | t | u | v | w | x | y | z | ¡ | ¿ | Ð | Ý | Þ | ® |
Bx | ¢ | £ | ¥ | · | © | § | ¶ | ¼ | ½ | ¾ | ¬ | | | ¯ | ¨ | ´ | × |
Cx | '{' | A | B | C | D | E | F | G | H | I | SHY | ô | ö | ò | ó | õ |
Dx | '}' | J | K | L | M | N | O | P | Q | R | ¹ | û | ü | ù | ú | ÿ |
Ex | \ | ÷ | S | T | U | V | W | X | Y | Z | ² | Ô | Ö | Ò | Ó | Õ |
Fx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ³ | Û | Ü | Ù | Ú | APC |
于编码表中,0x00 - 0x3F及0xFF为控制字符,0x40为空格,0x41为不换行空格(no-break space),0xCA为选择性连字号(soft hyphen)
最大的特点是26个英文字母不是连续的。
UTF-8
(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码(定长码),也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
UTF-8使用一至四个字节为每个字符编码:
- 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
- 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。
- 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。
- 其他极少使用的Unicode 辅助平面的字符使用四字节编码。
互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。[1]互联网邮件联盟(IMC)建议所有电子邮件软件都支持UTF-8编码。
代码范围 | 标量值(scalar value) | 注释 | |
000000 - 00007F | 00000000 00000000 0zzzzzzz | 0zzzzzzz(00-7F) | ASCII字符范围,字节由零开始 |
七个z | 七个z | ||
000080 - 0007FF | 00000000 00000yyy yyzzzzzz | 110yyyyy(C0-DF) 10zzzzzz(80-BF) | 第一个字节由110开始,接着的字节由10开始 |
三个y;二个y;六个z | 五个y;六个z | ||
000800 - 00D7FF | 00000000 xxxxyyyy yyzzzzzz | 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz | 第一个字节由1110开始,接着的字节由10开始 |
四个x;四个y;二个y;六个z | 四个x;六个y;六个z | ||
010000 - 10FFFF | 000wwwxx xxxxyyyy yyzzzzzz | 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz | 将由11110开始,接着的字节由10开始 |
三个w;二个x;四个x;四个y;二个y;六个z | 三个w;六个x;六个y;六个z |
Note 1 Unicode在范围D800-DFFF中不存在任何字符,基本多文种平面中约定了这个范围用于UTF-16扩展标识辅助平面(两个UTF-16表示一个辅助平面字符)。当然,任何编码都是可以被转换到这个范围,但在unicode中他们并不代表任何合法的值。
UTF-8编码字节含义
- 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;
- 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;
- 如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;
- 如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;
- 如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;
UTF-8的派生物
Windows
虽然不是标准,但许多Windows程序(包括Windows记事本)在UTF-8编码的文件的开首加入一段字节串EF BB BF。这是字节顺序记号U+FEFF的UTF-8编码结果。对于没有预期要处理UTF-8的文本编辑器和浏览器会显示成ISO-8859-1字符串""。
Java
在通常用法下,Java程序语言在通过InputStreamReader
和OutputStreamWriter
读取和写入串的时候支持标准UTF-8。但是,Java也支持一种非标准的变体UTF-8,供对象的串行化,Java本地界面和在class文件中的嵌入常数时使用的modified UTF-8
。
Unicode和UTF-8之间的转换关系表 | |
UCS-4编码 | UTF-8字节流 |
U+00000000 – U+0000007F | 0xxxxxxx |
U+00000080 – U+000007FF | 110xxxxx 10xxxxxx C080~CFBF |
U+00000800 – U+0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx E08080~EFBFBF |
U+00010000 – U+001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx F0808080~F7BFBFBF |
U+00200000 – U+03FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx F880808080~FBBFBFBFBF |
U+04000000 – U+7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx FC8080808080~FDBFBFBFBFBF |
ASCII字母继续使用1字节存储,重音文字、希腊字母或西里尔字母等使用2字节来存储,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。
在UTF-8文件的开首,很多时都放置一个U+FEFF字符(UTF-8以EF,BB,BF代表),以显示这个文本文件是以UTF-8编码。
- 字节0xFE和0xFF在UTF-8编码中从未用到,同时,UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM。
- 表示非ASCII字符的多字节串的第一个字节总是在0xC0到0xFD的范围里,并指出这个字符包含多少个字节。多字节串的其余字节都在0x80到0xBF范围里,这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响。
- The octet values C0, C1, F5 to FF never appear.
- In UTF-8, characters from the U+0000..U+10FFFF range (the UTF-16 accessible range) are encoded using sequences of 1 to 4 octets.
UTF-16
是Unicode的其中一个使用方式。UTF是Unicode/UCS Transformation Format,即把Unicode转做某种格式的意思。
它定义于ISO/IEC 10646-1的附录Q,而RFC2781也定义了相似的做法。
在基本多语言平面内定义的符号((Basic Multilingual Plane, BMP),或称第零平面(Plane 0)),使用2个字节表示,在此之外的字符(其他平面内的字符),则使用4个字节表示。由于第零平面内,从0XD800到0XDFFF之间的区段是没有使用的,因此可以利用0XD800-0XDFFF之间的值来对辅助平面的字符进行编码。
其编码方法是:
1 如果字符编码U小于0x10000,也就是十进制的0到65535之内,则直接使用两字节表示;
2 如果字符编码U大于0x10000,由于UNICODE编码范围最大为0x10FFFF,从0x10000到0x10FFFF之间 共有0xFFFFF个编码,也就是需要20个bit就可以标示这些编码。用U'表示从0-0xFFFFF之间的值,将其前 10 bit作为高位和16 bit的数值0xD800进行 逻辑or 操作,将后10 bit作为低位和0xDC00做 逻辑or 操作,这样组成的 4个byte就构成了U的编码。
UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)存储,但UTF-16却无法兼容于ASCII编码。
UTF-16的编码模式
UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintosh制作或存储的文字使用大尾序格式,以Microsoft或Linux制作或存储的文字使用小尾序格式。
为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark(UTF-16LE以FF FE代表,UTF-16BE以FE FF代表),以显示这个文本文件是以UTF-16编码,其中U+FEFF字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,顾名思义,它是个没有宽度也没有断字的空白。
The standard also allows the byte order to be stated explicitly by specifying UTF-16BE or UTF-16LE as the encoding type.
For Internet protocols,IANA has approved "UTF-16", "UTF-16BE", and "UTF-16LE" as the names for these encodings.
UTF-16与UCS-2的关系
UTF-16可看成是UCS-2的父集。在没有辅助平面字符Mapping of Unicode character planes(surrogate code points)前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。现在若有软件声称自己支持UCS-2编码,那其实是暗指它不能支持在UTF-16中超过2bytes的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。
UCS-2 encoding is defined to be big-endian only.
Use in major operating systems and environments
UTF-16 is used for text in the OS API in Microsoft Windows 2000/XP/2003/Vista/CE.[8] Older Windows NT systems (prior to Windows 2000) only support UCS-2.[9] In Windows XP, no code point above U+FFFF is included in any font delivered with Windows for European languages.[10][11] Files and network data tend to be a mix of UTF-16, UTF-8, and legacy byte encodings. For instance the registry is a byte encoding, and Windows will often display filenames from remote systems as byte encodings, resulting inmojibake if in fact they are UTF-8.
UTF-16 is used by the Qualcomm BREW operating systems; the .NET environments; Mac OS X's Cocoa and Core Foundation frameworks; and the Qt cross-platform graphical widget toolkit.
Symbian OS used in Nokia S60 handsets and Sony EricssonUIQ handsets uses UCS-2.
The Python language environment officially only uses UCS-2 internally since version 2.0, but the UTF-8 decoder to "Unicode" produces correct UTF-16. Since Python 2.2, "wide" (UCS-4) builds of Unicode are supported, and "narrow" builds officially use UTF-16.[12] In Python 3.3, UTF-16 stops being used for the internal representation.
Java originally used UCS-2, and added UTF-16 supplementary character support inJ2SE 5.0. However, non-BMP characters require the individual surrogate halves to be entered individually, for example: "\uD834\uDD1E" for U+1D11E.
In many languages quoted strings need a new syntax for quoting non-BMP characters, as the "\uXXXX" syntax explicitly limits itself to 4 hex digits. The most common (used byC#, D and several other languages) is to use an upper-case 'U' with 8 hex digits such as "\U0001D11E"[15] In Java 7 regular expressions, abstract code points can (and in character classes involving planes 1–16, must) be specified using the "\x{HHHHHH}" syntax used in ICU and Perl, where "H" may be 1–6 ASCII hex digits to cover the full range of Unicode.
These implementations all return the number of 16-bit code units rather than the number of Unicode code points when you use the equivalent of strlen() on their strings, and that indexing into a string returns the indexed code unit, not the indexed code point.[16][17][18] The term "character" is defined and used in multiple ways within the Unicode terminology,[19] so a count of them is not possible. Most of the confusion is due to obsolete ASCII-era documentation using the term "character" when a fixed-size "byte" was intended.
UTF-32 (或 UCS-4)
是一种将Unicode字符编码的协定,对每一个Unicode码位使用恰好32位元。其它的Unicode transformation formats则使用不定长度编码。
UTF-32 是一个 UCS-4 的子集,使用32-位元的码值,只在0到10FFFF的字码空间。
UCS-4,使用通用字符集(UCS)的每一个字符,会在0到十六进制的7FFFFFFF这样的字码空间中,被表示成一个的32位元的码值。
UTF-32 原本是 UCS-4 的子集,但JTC1/SC2/WG2声明,所有未来对字符的指定都将会限制在BMP及其14个补充平面,并移除先前在 E0 到 FF 平面的 60 到 7F 群的私用空间。
于是就现状而言,除了 UTF-32 标准包含额外的 Unicode 意涵,UCS-4 和 UTF-32 大体是相同的。
Non-use in HTML5
HTML5 states that "authors should not use UTF-32, as the encoding detection algorithms described in this specification intentionally do not distinguish it from UTF-16.
On Unix systems, UTF-32 strings are sometimes used for storage, due to the typewchar_t being defined as 32-bits.Python can be compiled to use them instead of UTF-16. Use of UTF-32 strings on Windows (where wchar_t is 16 bits) is almost non-existent.
参考文献:
http://zh.wikipedia.org/wiki/Shift_JIS
http://zh.wikipedia.org/wiki/GB2312
http://zh.wikipedia.org/wiki/UTF-8
http://zh.wikipedia.org/wiki/UTF-16
http://zh.wikipedia.org/wiki/UTF-32
http://zh.wikipedia.org/wiki/GB2312