  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14161
- 金币
- 2371
- 威望
- 1647
- 贡献
- 1319
|
HTML语言:什么是Unicode 什么是UTF-8
Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:
; F+ r7 f9 ~. `/ y, w) M/ G% T9 j$ C, j1 I4 n
1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。* ~3 d, D9 g W- u) I
+ X* {6 J9 t* a8 }8 A, Y8 ]
最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。% j3 D- @+ }' x- A- ~
' A$ w/ D$ h1 ^& X9 E V0 V
2、台湾,香港等地使用的是BIG5编码
7 r( F& R' J9 s$ {) M0 n- r; |: n1 n4 n- d6 P% q# d
3、日本:SJIS编码1 i6 L4 U7 V9 Z, |' t/ T( v
% w% g- H- ?; S: F3 l
如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。9 T5 }7 F) [- K: [, ]$ g
1 X8 L# C) q8 z/ S 在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。 比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。
# J' v4 E C. W) R8 y( a9 B8 g& O1 ?$ }# P* d5 h- n/ v% @3 d* [
Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
t: l# E; j) v; Z) ~. k" [0 Z4 R
现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面. f. i9 S, U* V8 W- j7 @9 }3 Q
8 r5 F/ ]; C+ G% r- [ 20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF - 26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
8 G5 x4 { d; z4 D& L" R0 x+ z, Q- b0 b6 \4 r5 H% w2 |
总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。( P X0 s, n9 W1 S
7 m- e" B2 E: U4 | ]( ~1 I& V 什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
" T8 h; C; z( s, k" H$ U
0 F0 a" y, w8 q, P) [$ ~ 比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
! v( L# ~/ {/ \: h" ]
# d& p- o, N: M; E codepage=936 简体中文GBK
* m6 W) B$ E! C g+ a
9 `5 `/ D* M* s7 a codepage=950 繁体中文BIG59 I7 ~% |# h7 w1 O4 p& o
q% {1 z+ z% B; ^ codepage=437 美国/加拿大英语
, ~! Y! l" |# H" K. a2 X! l2 F+ b+ k- S; z4 K
codepage=932 日文
' X3 \) R' F, `; {* x A1 [' u
! U0 m) Z! U9 Q1 G) n codepage=949 韩文
* ~% n& L( S! G. f
5 P4 m: P7 A, k% e8 a& ? codepage=866 俄文
9 X B7 H6 ^5 z& v0 m
2 `7 Q0 g$ E* L; i codepage=65001 unicode UFT-8
% s; U: J" |! {4 R% y, S9 T! V" @& R
最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。2 {- f; r3 y" F% A4 v( {
7 F$ C0 @3 C+ @6 h1 W4 m 从936中随意取一行,例如:
* S1 \; E: E6 O2 I* g
: g0 T+ Q4 K% ~ 0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
) E' j6 M' p+ F
V3 I ^ Y% u7 u+ V 前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
+ i+ X: ~& }. S1 O" U) d% [# D! W0 T' ~+ ^/ _& i: X: Y
现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
% A8 d, ~2 ^5 o
& |( G# J8 O6 M1 I) }7 m ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?# O" [5 v5 \+ k% r6 M
4 S/ ~0 W, K7 l c) e7 v* F4 n$ q2 G4 V
例:! ?" a1 m& Z7 B+ G
$ ^3 M# v/ F! l/ d5 k8 l0 z E4 BD A0 11100100 10111101 10100000
# Z- e) b" N: S3 E. `# z* ^ I+ k7 V
这是“你”字的UTF-8编码
8 D1 Y/ q1 J5 Z$ q. o
0 \. L& l3 D# t# x 4F 60 01001111 011000002 S6 f) T( }! r
. z V' p7 b, ?3 I& q9 T 这是“你”的Unicode编码( }4 D3 l3 O+ ]# v
& L1 H1 C& b8 [8 m
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。% ~2 ^6 R& U8 r s5 [; `% D
* s; s% B; ^ z6 O0 u9 |5 v( z
以下是Unicode和UTF-8之间的转换关系表:8 V% I2 \& w- w
* j% x- s+ Y8 Z5 G, r7 n
U-00000000 - U-0000007F: 0xxxxxxx' {0 b1 S; C7 r! [
+ J8 T/ x0 r! E3 r0 R U-00000080 - U-000007FF: 110xxxxx 10xxxxxx9 B. Y5 s: a* O1 X
' V: V3 U' a5 x
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx5 D) e9 ?! {+ T) _( Z% l
% {! m+ p; j+ O$ s
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx% L" N$ l& i6 p1 \" Y) u2 n# L% C
3 A5 c1 x: R; j5 K0 B
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx9 ]$ J1 F* j6 i2 l- @
. J) [$ `' g$ A U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
7 W1 a/ n( G5 g8 J1 ]- j; z
$ i! E9 |4 x% d. v; S7 b Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。 |
|