字符集编码汇总

本文详细介绍了Shift_JIS、GB2312、GBK、Big5、UTF-8、UTF-16和UTF-32编码标准,以及它们在字符集、字节结构、编码范围和应用领域的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不能处理,这导致了后来GBKGB 18030汉字字符集的出现。

分区表示

GB 2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码

  • 01-09区为特殊符号。
  • 16-55区为一级汉字,按拼音排序。
  • 56-87区为二级汉字,按部首笔画排序。

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属中文内码,知名的中文交换码有CCCIICNS11643

字节结构

Big5码是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE。在Big5的分区中:

0x8140-0xA0FE

保留给用户自定义字符(造字区)

0xA140-0xA3BF

标点符号希腊字母及特殊符号,
包括在0xA259-0xA261,安放了九个计量用汉字:兙兛兞兝兡兣嗧瓩糎。

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编码是按读音排序的。

编码方式

字符有一字节和双字节编码,007F范围内是一位,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。

之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81FE(也就是不含80FF),第二字节的一部分领域在407E,其他领域在80FE

具体来说,定义的是下列字节:

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 13000Unicode的全部统一汉字,共收录汉字70244个。

GB 18030主要有以下特点:

  • UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
  • 编码空间庞大,最多可定义161万个字符。
  • 支持中国国内少数民族的文字,不需要动用造字区。
  • 汉字收录范围包含繁体汉字以及日韩汉字
  • 字汇

此标准收录的字符以单字节、双字节或四字节编码。

·         单字节部分

此标准中,单字节的部分收录了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) 扩增二进式十进交换码,为IBM1963年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使用一至四个字节为每个字符编码:

  1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
  2. 带有附加符号拉丁文希腊文西里尔字母亚美尼亚语希伯来文阿拉伯文叙利亚文它拿字母则需要二个字节编码(Unicode范围由U+0080至U+07FF)。
  3. 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。
  4. 其他极少使用的Unicode  辅助平面的字符使用四字节编码。

互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。[1]互联网邮件联盟(IMC)建议所有电子邮件软件都支持UTF-8编码。

代码范围
十六进制

标量值(scalar value)
二进制

UTF-8
二进制十六进制

注释

000000 - 00007F
128个代码

00000000 00000000 0zzzzzzz

0zzzzzzz(00-7F)

ASCII字符范围,字节由零开始

七个z

七个z

000080 - 0007FF
1920个代码

00000000 00000yyy yyzzzzzz

110yyyyy(C0-DF) 10zzzzzz(80-BF)

第一个字节由110开始,接着的字节由10开始

三个y;二个y;六个z

五个y;六个z

000800 - 00D7FF
00E000 - 00FFFF
61440个代码 [Note 1]

00000000 xxxxyyyy yyzzzzzz

1110xxxx(E0-EF) 10yyyyyy 10zzzzzz

第一个字节由1110开始,接着的字节由10开始

四个x;四个y;二个y;六个z

四个x;六个y;六个z

010000 - 10FFFF
1048576个代码

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程序语言在通过InputStreamReaderOutputStreamWriter读取和写入串的时候支持标准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制作或存储的文字使用大尾序格式,以MicrosoftLinux制作或存储的文字使用小尾序格式。

为了弄清楚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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值