  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14163
- 金币
- 2372
- 威望
- 1647
- 贡献
- 1320
|
HTML语言:什么是Unicode 什么是UTF-8
Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:
+ O3 o8 h' M9 A1 N# P0 m
4 W- J: j* y/ x2 V/ r+ R G9 c 1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。5 Z$ f! f0 ^; F7 |% \
7 `" _5 i: [ o, `1 o 最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。( V5 M& E; S7 W& s& @: P3 L ^
0 D/ {$ ~; s* N 2、台湾,香港等地使用的是BIG5编码
' v- D) f0 [4 }2 A5 H0 r- ~% T/ d5 M+ g, m/ A7 [
3、日本:SJIS编码
7 B& s" h2 K) b+ V: ^3 D5 e* Q, J6 X) [
如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
! c4 H; D/ L4 \ B% g2 o" j( d4 k% W
, p7 x% w4 ]0 Q8 O 在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。 比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。
- g& C, l& ?- s& V6 q; M# w
) d" g9 f% C* T7 f3 f) h Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
. v* i* {; N1 A* O
* f8 K+ f8 s* }" r$ d6 U 现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
( O/ ~! I/ H: C: t
( m7 ` L/ P$ u! z1 _5 T5 [ 20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF - 26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
5 b# y0 W# X V! a9 b
+ ~( a0 q! Z2 X* F6 r 总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。% d$ q2 h. S7 y% V7 b
6 R1 _3 R/ h* \' b1 M1 s# F
什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
4 t1 e0 B; p- ^- B x0 P
& l1 e, y1 W/ W" ^8 Z) w7 a 比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
. H: V8 |8 E% e: m% F7 Q( V6 p! B
( q/ G$ r5 h0 ? P. I codepage=936 简体中文GBK8 s0 _- a) D1 _% Z* [, K" M/ n
% Z% Z7 R' I* B9 p; k, h; X2 J, v codepage=950 繁体中文BIG5
0 l6 C. D5 O- w: \8 f5 s) ~5 s; T
1 D% `1 g) i" j, H0 D codepage=437 美国/加拿大英语) i7 m+ _4 t& A3 V2 E
% X; E8 I' o3 m/ R) M. s
codepage=932 日文
: C7 y" |- u& M9 n) M- Q& M$ F( L
" @5 s3 V" y8 x3 f% G B codepage=949 韩文
8 ]$ l- }1 v# ]: _# `' |. p- I4 M
codepage=866 俄文
6 k, p8 V3 p8 {: e# E! g9 i8 i5 i
+ r M/ o9 W; p9 n& d0 c& k3 w R codepage=65001 unicode UFT-8
. x* J7 W% M) v1 V' T: X7 Y/ d7 C( N$ |9 @$ m: L. \
最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。" f ]3 n6 o- W1 k
/ B1 T+ J+ d1 ~& t
从936中随意取一行,例如:
; f% g; T: g, N: I! s: G2 |! _- s2 L. r! v2 l U/ ~
0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH8 Q c8 T* @% Q! _
9 W0 V& o3 G7 I4 I5 T) a( d
前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。8 B! n& y4 f4 ~9 v! s0 m, N4 O" E9 J' V
* j: }/ I+ ~5 y' \( P 现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
, P) }" r' c( J! g) v' Q+ O( x% |
ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?9 ~# R5 |+ m+ ^ j7 S8 R: m
: i& K( {& C/ h 例:
" B2 W8 O1 [9 p; `0 g0 |: @( j& K% `3 M# ?' P, \/ V8 r. J1 \# I0 y I
E4 BD A0 11100100 10111101 10100000
& s2 A$ m3 d+ p4 D6 M
- P. _7 ]$ k2 R$ |# O' y 这是“你”字的UTF-8编码. e; y( L$ j5 a, D9 l; Q
- v b# A; V; {5 R8 u/ h5 a
4F 60 01001111 01100000
2 l2 Y. A4 i% h6 i- ^0 U8 b) Y- b
& M9 t | V C; u- K 这是“你”的Unicode编码
' H, z* l, T9 V& O6 e* F/ L+ b6 u1 L6 P
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。/ P& m( P; |4 F, R5 w% D3 X
5 l0 v/ n6 }; h# S6 d
以下是Unicode和UTF-8之间的转换关系表:2 ^) D8 A, ]2 v
4 u5 W' O+ j d6 l) D4 Y2 {3 G U-00000000 - U-0000007F: 0xxxxxxx
+ g( M! G) G, L8 I3 r
2 A2 G! V2 J) u0 T+ q9 q& V U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
( W/ K3 X8 C7 c5 K* N& u& F
4 ], r- }% E8 o1 G7 r9 m( @ U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
( T8 D l+ i0 P# B# W: o4 V. B5 R5 Q* s1 _
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx/ A& e' m, O! S) L
6 `7 L) ]9 |0 ^
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx' R2 k C4 L( w$ x
& T3 q+ u# _, X0 ?1 p U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx/ V' }, j# H$ m+ g8 ~: ?+ E& ?
* D; x3 X6 j* O
Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。 |
|