|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14443
- 金币
- 2507
- 威望
- 1647
- 贡献
- 1455
|
HTML语言:什么是Unicode 什么是UTF-8
Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:, S( k2 A* [$ |* A2 ?
4 D* y" k/ J$ v 1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。/ C% h* K; T2 p$ z/ }
: G# l; B/ C* u" {: [1 Z% O
最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。& S7 ~' D& y6 [( L5 l
& b) v- y# X! T 2、台湾,香港等地使用的是BIG5编码* X4 h. y" b7 O. p
0 l+ J, b8 s9 i2 X6 d3 q" t1 u4 W 3、日本:SJIS编码
% @/ f! p1 Y9 i1 X* y$ B6 r0 a" {) k J2 ?# |: }! F
如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
; m7 c! T2 U! g5 ^0 ^
1 O; H! T7 p/ o+ X) s: r- Q 在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。 比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。& t* x% I4 m' ^7 X
$ ?3 }. x M) | j' o M: A
Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。2 t X+ h: h5 g* k8 k* @3 n
; {5 i4 A6 e8 v. N0 }6 V( @
现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面: j( {4 V- i0 Z5 L$ L' B
* n, d( Z8 ?9 d% \ 20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF - 26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF( T3 F. e% O, b3 ?
5 N5 T }, l) {% _9 L
总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。: G& y; o) @0 \2 |& y6 \
6 @$ @9 q' I* {* Q, X: m" m 什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
, X5 Z' B M& @# L: G/ y r
9 L* n- C# ]; F' I6 N( S' c! p 比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。8 T" s) |' e) k- s, q% ?% z% Z6 q/ W
. v3 v% }) L$ a: p
codepage=936 简体中文GBK
; ]9 T4 p+ m% y" R
: b8 c" m/ _6 F4 l codepage=950 繁体中文BIG5
& c! K( I/ p" B6 w1 D1 }7 V( f# f& K1 A
codepage=437 美国/加拿大英语7 Q0 b' ]; c( x, f( Y3 _
0 j$ ]& y/ X2 r0 N$ d& e! P codepage=932 日文; `2 L, D% _" @8 N
6 `' v& W4 F2 I# N4 B
codepage=949 韩文& {8 }) s( W5 I( t+ _+ I
: y1 E1 d- A. }& Z) s codepage=866 俄文1 c# M; t; [8 h
) L# d3 p5 ^; e4 f4 I
codepage=65001 unicode UFT-85 J* ]6 B8 s9 |% |2 O6 p
- k5 ?# g- n; r4 `) x% e( h 最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
6 p( c3 _. ?# m' e) ]; j, a e9 l9 @4 H3 @
从936中随意取一行,例如:
0 j: i" f* v# g( s8 g+ E9 @& N' V7 K/ ~( p" T. G
0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
+ q @4 j0 O) g3 W) b: v3 h7 R: K* k9 L, n7 V. s/ s! `
前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。" B& t$ t" P+ T
: i* Y$ Z( C7 m0 f) k) t( v 现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
0 A% j- o2 S9 Z+ |" o8 H
& q7 h$ I k* p6 ^( q. a- h \' A ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?
, a- @* T# f: W) X8 {* G, ?; w) q7 W% \/ h. H3 E( C# o
例:
' j4 @8 S: {8 _8 z3 F# k; z- K7 n0 W: y8 W
E4 BD A0 11100100 10111101 10100000
8 A( k+ p! A# I& j' d! F
2 Y4 S& r" a2 { 这是“你”字的UTF-8编码, ~ |# G( {" S" `
" }) }' o4 K- {% [ 4F 60 01001111 01100000( d6 b; h; X0 {
3 S" f9 Q7 Y! K- W6 ~9 L" S& W 这是“你”的Unicode编码
: w) S. l+ u$ n7 d" ^4 u
7 b5 j, W- h5 b) u, v+ ~2 d 按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。( e* Y4 O, P) Q2 e7 l3 [1 Y
8 b) K- l' h3 q: `- E( h 以下是Unicode和UTF-8之间的转换关系表:$ o7 G5 f/ W# L: ^/ J
@: e6 o- I3 b4 [% E/ q4 a6 l
U-00000000 - U-0000007F: 0xxxxxxx
0 h- P- W2 d/ a0 K1 R8 N+ E0 G5 K) f7 P4 [
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
0 Y w" ]5 z; W4 X( i4 l" w1 k! r1 k3 {0 P# w- Z6 I
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
5 D0 ^* B* f3 w! @
9 r* ~7 o3 g4 ?6 ?! _5 [6 ?; X U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx6 R* i; Y: R8 h4 s& I5 ~
1 ~$ n" q- \" B$ M- Z
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
! l0 ?9 d0 i8 `" v2 x X( [% a8 ~4 S h
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx. ~. }9 P$ o; u, n4 v! \/ X+ g9 q7 z) b
+ B" G& M; L! t8 b- S/ ? Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。 |
|