|
  
- UID
- 1
- 帖子
- 738
- 精华
- 28
- 积分
- 14433
- 金币
- 2502
- 威望
- 1647
- 贡献
- 1450
|
HTML语言:什么是Unicode 什么是UTF-8
Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:- C/ M# U9 Z4 @: A# S5 f I* |8 {- ^
c) d6 h( S# y+ o4 W0 A5 T4 t 1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
8 I" D3 I" A' ^
" W$ V3 [. h$ C1 R4 e 最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。7 ]; m9 E6 B' B) d4 Q
$ [2 |7 \/ l) A- N) k( J5 A( I
2、台湾,香港等地使用的是BIG5编码
4 w# w! K: M2 s$ m9 [+ S4 ?3 {2 N$ O, {
3、日本:SJIS编码* n# y' [( c7 y6 [. }; P! A
& X) {3 W5 a X9 N9 h
如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
/ n: j5 n5 W5 E$ W4 X6 g0 V) J# h+ }9 p& g0 ]# E' I, F1 g( K
在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。 比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。6 b, ]; ^& n( m$ |* \
, a" j8 N' h: J( f3 `* I$ p Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
3 d2 y: ~; @. A% Z6 a' `
: f) ~3 p1 H' p# S# ` 现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
! l) v3 U) n) f3 G8 I" j$ T; z
0 O9 r, b$ G" G8 r# L 20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF - 26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF7 K- m8 q+ _& Z3 V% j ^2 S6 V: z
# v$ x) y% ]. g9 }, E( X 总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。, F3 W: O* h8 b" b. h
& q: c0 h4 o5 f9 G
什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。# b8 I" x' P V$ u; o$ E' G
: [6 |( R% N% T& E( Y 比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
7 ^9 N9 C) c! [ m- F, Q* B' k: o. s' d" N+ b! ]
codepage=936 简体中文GBK
2 S# r* u. L" f5 H* @; o5 f5 w& b+ P8 J8 Q J
codepage=950 繁体中文BIG5" H) Z- c3 ?' o" P! {
n) {; ]2 i$ E codepage=437 美国/加拿大英语
. N$ X- q+ N, A' Y
& G/ j$ {. v5 Y codepage=932 日文( J! k: \) Y" M/ @+ o- e, [+ |
- U: ^% H4 P* F+ k9 [- |7 L2 t codepage=949 韩文
9 N9 m% K6 K9 Y( m q5 n
3 y7 }$ [- a" d6 E6 l codepage=866 俄文
6 H( ]6 T! J. l, w7 ]& k( g! ]5 R; U
codepage=65001 unicode UFT-8
% c5 |% z! e( I5 P
; n. u) D) D# H 最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。1 ~/ @! q# d, F# o
+ t3 p2 ^1 u9 D8 `: O; j" ] 从936中随意取一行,例如:
, v9 f6 ]+ @9 {' M4 D
) c' U+ h& F& m4 K( E+ L9 z' |+ A 0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
7 n' ?. T# j5 }0 ~
. E0 z* [" }' u 前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
+ G2 _6 F7 z) m) l
8 o9 v5 F+ Q4 \2 s' X5 L# w 现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?- a) i/ A* e8 b
/ c& k6 ? W7 r3 @9 Y" C% w+ V ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?- n+ a: C8 ?3 `4 h
8 @8 m b/ _0 z' E* S
例:
" S8 p: _3 z5 _( {, ]0 b$ ^/ u# W$ J( J0 r9 g+ ]5 H' h
E4 BD A0 11100100 10111101 10100000+ E; B- _+ o: f1 l; {
6 ]) ~' ^3 i' q% X# B
这是“你”字的UTF-8编码
$ J+ D- n% m$ |, Y9 _" D! n) V% q4 O3 a2 D) p" s
4F 60 01001111 01100000
5 |% t/ _, p) b/ }6 `5 t# c# V! t1 X4 j; e* I w3 Z% g" c8 N* r
这是“你”的Unicode编码
& P: y" X. `" I5 l# [& h8 x$ x1 Q7 k) n" m" o) e; Z
按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。3 T! ^5 \; {' b) |& F
6 H0 S/ Z& V3 q2 V4 F u- E
以下是Unicode和UTF-8之间的转换关系表:
) z% w" [4 G- a: j8 u0 n
7 @4 ~ T4 u. q) X U-00000000 - U-0000007F: 0xxxxxxx4 G0 `) x- H0 c5 P/ v. f2 X7 o& E
9 ~7 X, F1 Z+ W* v9 L U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
- x/ ~3 Z# V0 I" L
0 W) \) g+ L# s2 n5 \ U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
. y8 K# E1 L# R2 O
4 x# O1 ~$ B2 |0 N/ x- C U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx' i' p& ?% B& N% ?. E" ?' h U( F8 y
9 ~7 I+ Z/ r( A
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) R3 a2 D9 p( V
! i9 ^7 [. u/ \3 u% A# V3 @- |. ^! P
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
/ B: I$ L: j2 d! ~( ^) o3 b
: j% x* m8 R! i$ {9 } Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。 |
|