Board logo

标题: HTML语言:什么是Unicode 什么是UTF-8 [打印本页]

作者: admin    时间: 2008-1-19 23:35     标题: HTML语言:什么是Unicode 什么是UTF-8

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:
" p  w7 O. p" I9 o1 Y6 C3 B( I$ m$ m- R! W% t+ ~! E
  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
8 E" C+ w4 D' Q$ m1 O
# j& M' q9 t( h, `  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。& T! G* |0 Z' J6 {8 i+ m
6 q+ _& s0 N! S2 J6 _1 M* J' c
  2、台湾,香港等地使用的是BIG5编码
7 S8 k. J  c8 {1 e: _  Q
" M5 A- a) d7 t/ }$ }  3、日本:SJIS编码
& I; ?, ?$ |/ t0 ~
" _2 G# u7 K8 f% e% Y( {  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。, c; C) P" m+ |5 Q5 A

, J$ F6 X/ A2 J3 J  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。* t9 S7 y5 `6 c* ]4 ]* J

2 v) s. Y3 d5 i3 a2 T3 _% ^  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
, U: f5 J1 o8 r5 ?" h6 O( f
0 c7 ?$ z* v5 p3 V+ c  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
* d( x2 s6 `1 @) J
# c) T3 m4 l+ q8 ]. \1 C  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF4 ?  F- b0 y- U4 F3 b7 w, m+ `; F
+ w6 D5 ^& H! A- J1 n0 _
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。; K( `& b1 n4 I, k1 |
; g) {( ^9 f" |1 q1 h  b
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。2 @* [( H$ D& l) z& G

+ m! x: b3 p3 z% `  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。- C1 ?) y0 K! h; O! y! q5 W
. d% Z/ a) |. @; n) ?+ F' E
  codepage=936 简体中文GBK+ p1 Q4 X8 r8 q; b. S' T; l' r
; I) b% d5 @5 v" ~! o& c& m" i
  codepage=950 繁体中文BIG54 f$ B& Q3 O8 l7 [. K# c3 s

" O+ Q- Z' H. F  g  codepage=437 美国/加拿大英语( `/ s5 b* V  G+ T. y0 ]
* j9 `5 m$ R5 E) C& Q
  codepage=932 日文  ?! b; R2 a, e+ ~# c4 ]" E
5 m) e$ }6 ?+ l0 k* `9 C
  codepage=949 韩文  D: P# G9 a% y% U. f4 U* `1 P) M
, T- [; j# K  ?3 Y- M8 @4 j
  codepage=866 俄文
, F* J7 l( ]; M8 X  J) L
, b7 F( M* i. e* U* A  codepage=65001 unicode UFT-8- T: b5 X' n, g: Y
3 e; A- b/ m+ v; F" Z7 i7 ^
  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
+ S1 F8 D- l8 ~6 d
% O% Z2 I% `' k5 T( t4 b  从936中随意取一行,例如:
- G4 ?* y6 q/ l% A4 q+ K
' T# p9 Z1 x5 [5 t$ d  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH2 F0 G  H0 b; m5 C$ _8 T  ?
5 A. _7 b+ C2 G9 c5 v8 s5 ]$ ~
  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。% A2 X+ g  I7 G  l6 c

8 z8 ]+ K5 N% k# ~( I# J) k  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?7 @  F, Y  z8 p2 Y5 p
8 C; E# ^. ?+ o3 d
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?3 o+ E% h* Y- B! r. {
, p" @! @1 E! ~" `/ j! ~/ U
  例:
$ c3 _3 m) ~7 n+ l  X/ ~  f
# w6 M3 ~& x& m9 y9 Z2 ~/ [  E4 BD A0        11100100 10111101 10100000( N5 v: q4 t3 n1 K4 g4 V4 e; c  u
/ a+ o& ^0 d; P7 g) x" q
  这是“你”字的UTF-8编码. t/ `# \1 }2 ~/ @& D8 F0 a
' s7 `9 z, G& ^5 s& ]
  4F 60          01001111 011000009 M' M" ?9 a+ f6 M% Q/ f3 i
6 O9 ^0 w' Y9 m+ r- j' k8 f
  这是“你”的Unicode编码
1 ?8 S* h  R# W& t
! a1 S& k' P# R# w  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
) Q7 J" P$ _% z
3 p' {# _+ z" q# U/ p/ p7 c  以下是Unicode和UTF-8之间的转换关系表:- Z% C) m# N! l% ?! Z

; A% ^) c4 v! a6 i* y2 D  U-00000000 - U-0000007F: 0xxxxxxx
6 z+ V- F+ R  x6 s0 a6 K* s) J) D7 Y8 r
  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
0 p9 h  |* W8 A2 {; j  R
4 P: L% J$ j. x3 p1 K+ L  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
/ Z8 R6 @: L' s5 ~8 C# F% A- t
- V/ \. N9 Z( D, _  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
# @7 Y, G* D$ M: T5 |% T9 t' Z' {
  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
: l% f  _( \( p4 a- q2 h2 a5 J# g) u- Z* z0 ]/ K( Q) b
  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0 X% g/ y. D* m. j& `# a0 [0 F9 g7 z: E5 j: C
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。




欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2