返回列表 发帖

HTML语言:什么是Unicode 什么是UTF-8

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:8 a) k' a+ F" P0 Y& v, f& k0 w

9 x: N( c: w7 Z1 R/ N( H  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。& x" }$ A- F' O/ @' r7 M

6 C7 q+ B4 p0 U  @1 g* f  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
0 U) E6 J7 K/ P! ^/ A  N( t7 ], q) c$ H  m+ P; u" C* f' e! [
  2、台湾,香港等地使用的是BIG5编码
: w$ X5 ?# ^2 L3 x9 U( j' p" ]$ F) v3 r
  3、日本:SJIS编码
5 Y' p' ]% R7 I5 ~: p
  b9 K5 G8 l! s; u9 [& u  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。% s- Z1 Z. R* ?- V0 n9 c
, r& G. G6 P8 _  X1 W/ W
  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。& a/ S: \: n( l* [$ P, z% S
+ C, }, l) U* J7 y% B
  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。! `3 F& w: C* z' }
  o, A7 |8 M) ?- a( f" m
  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
6 v4 ^) A5 E& X
- K8 S$ Q$ j8 q8 {2 C/ m: G2 y- ]) [  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
% O( S+ R3 t* w1 q/ p# A& C7 n3 ^( U/ D! I1 M9 t% |6 q, N3 M2 F
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。  D/ Y+ r- _: E& I* w
. H7 {# m5 D; r6 o
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。) W; Y$ a$ g# D, k1 k% Y6 O" F" i
: X. s1 y9 ~1 Q! B5 p
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。1 l+ v' Z. e: x* j

9 V( s" `9 o  C. u  codepage=936 简体中文GBK$ H$ G$ J) |8 h3 E

8 I/ L' T: x2 h7 T$ ]9 C/ X9 ?4 }  codepage=950 繁体中文BIG56 `# k/ X" ]& U: S5 A: U0 g

1 X6 @. U. \5 e' K  codepage=437 美国/加拿大英语$ M) e2 r) f7 {* W4 H2 G& P1 z

( s6 s/ V. ]$ M2 l/ {# w  codepage=932 日文; |6 P; |7 m, u0 v3 c7 z

5 t8 y! \3 B! ^0 s  codepage=949 韩文& x3 y* s; ^1 d9 W" h

/ o; E0 E7 O) f8 C2 q' Z; k7 u, q; z  codepage=866 俄文
& o7 n- {. e- r4 I# ?! \1 E  q1 q2 V/ R: F! ]3 i  j
  codepage=65001 unicode UFT-8; r, i9 l: z  D- Q7 f' p* Q

8 W5 _5 K, Y' ^4 v2 _/ z2 A  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。8 M- A: x& a; T/ M0 e3 t
, P8 Z- b  x( [2 t1 r3 b0 A4 @$ b
  从936中随意取一行,例如:
" h  }6 Q$ a8 p. i: {  b1 O1 F. _0 n* L; X; T( c- |
  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
, {$ a5 I  q4 g: ?6 w* \: h8 P7 b& n7 h" y: t& K
  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。3 E( n" f7 L, q8 a3 G0 _# B4 m
2 W. p/ ]6 i  n% A
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?1 L3 S; \* M% A' z$ S' o* V
! K5 ^1 b" u- |
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?
6 N8 b; L6 Q" V+ K% Y% a. Y
0 S: f$ p" E6 j! X' ?# C. T$ C  例:% U" m8 b% ^2 c5 _* p( f* ~
/ a2 x, k1 p5 B% R7 R9 w+ p. ?5 C2 c
  E4 BD A0        11100100 10111101 10100000
7 C  Q- X% n/ @* p! t& g4 K3 _: w, W+ ^) ]
  这是“你”字的UTF-8编码3 S  Y8 ?3 G4 ~; D% ^9 d1 P# K' y

+ Y7 |1 n* C2 i& i0 w+ N8 A3 o  4F 60          01001111 011000001 o5 w4 X. z& f6 N; p
% ~( Q& j2 v  H
  这是“你”的Unicode编码
, V2 k& W$ {( D( Z5 z  P- G% S% k! b: ^
  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
" y6 b* J- v- a. C, a3 n, d$ }
  a, e( d& {" |) o$ }  以下是Unicode和UTF-8之间的转换关系表:
9 r  y$ i" j# V' z4 W( [
( ~9 d/ n8 c1 ^  u/ k1 }  U-00000000 - U-0000007F: 0xxxxxxx  M9 n4 o4 P6 p3 Q0 U

) D2 Y' }' ~" A/ K) n2 c  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
) V9 H1 k; r0 m) W. c- L
2 u; }# g7 f  R; h$ F9 I: V! n  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
# A& f8 D5 @% ^* K5 a  I* J+ k; S7 f( p0 Q
  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
2 Q, T3 T' o" _& E" Q) `! ?  J0 W' Y4 a& ]$ q2 A, Y
  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
$ M" Y6 \- Y0 s7 n+ o% D" q! V5 B- E
  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
% U+ P6 n- @7 X9 c3 g
4 r+ k6 h+ @7 X6 p/ `  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

返回列表
【捌玖网络】已经运行: