Board logo

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

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:+ k: `2 c$ a: z9 b& H

0 P7 E+ F# J$ E7 k  E  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
+ m! m( @; o0 W7 n* D: c) m: o9 q8 D, U
  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。& u0 S$ v7 w& j; s+ I% M
2 Z* U6 }& S3 w. [; G) M% H. l2 K
  2、台湾,香港等地使用的是BIG5编码% s. b- H' A0 S8 k0 ]3 v8 P
3 Y$ H' a$ J  n5 G$ i. H
  3、日本:SJIS编码
, r% v- o& V; h( U  j' z/ w8 M1 y& U& T! q: z+ @
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
0 ?, C/ x! _4 O6 ]
( p) K" E8 c6 @+ R' F9 @  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。
& {( \: u0 Q- T+ W2 Q5 b- V  ~& o. k
  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。' D" ?3 k) r/ l

0 S/ I: h0 ?+ N9 a) K* I  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面9 Q" A2 c& ~! Z, A" y" T
& p( L$ E! F) i8 q* b% f
  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
! D8 v3 u+ Y: ]3 V' N
( c) t( W) _- C+ j6 p  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
+ f; i! i& u: Z) N5 a
. ~/ l: Z4 h: @$ @& d. w  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。2 p8 G' B% \4 k' {; N4 \7 S
/ c2 _! z. m) Y( s
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
) y1 {$ ^9 v% i( ^; r) s! f
, C; L1 T9 r4 ^( I5 |  codepage=936 简体中文GBK6 }" l  h) Q' ~, A" a' ]9 U1 H* B

% ?9 A$ c  l5 s! Y  codepage=950 繁体中文BIG51 |( h. I( B. d
. R. Q( n" g/ @2 s
  codepage=437 美国/加拿大英语9 m/ y* r, a5 E7 K) P3 t
/ N7 g9 T1 q( j+ ]  w+ `* M" u7 @
  codepage=932 日文
* `% c; B' e8 Y4 ]; s3 h
* [9 o/ U( n. V% f* ?7 P7 z6 x  codepage=949 韩文( z2 U7 O( @4 W: B5 R; P  N1 ]1 G( Y
' B* R% K$ n$ D- m
  codepage=866 俄文
* y; G: {8 L: ^! l! U5 B
+ n- w: D! J5 T0 J! R! E7 G  codepage=65001 unicode UFT-8
$ H7 A1 p8 V# x9 Z3 T
; \" I8 w+ `2 E; h! L  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。7 u4 A  Z4 s; H6 [

  U* l  }9 L0 q9 a, F/ T* U  从936中随意取一行,例如:; R% D  P: q! z/ F( |5 |" s& d
& @) M+ x! N) g3 K  w
  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
4 t. O9 g7 Y) S- j* I4 F: s) S! ^
9 u& b8 n: W2 b6 u- H  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
: _2 G$ j7 S, T. d) S2 Q
/ N  ]1 J/ D! r8 c& {: U: Y! j  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?  ~2 x5 J; `" I4 ?. Q
% u9 m9 K8 R% r% H. d
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?  K7 a0 K: V! ^: u; F: ^  {/ S
. b3 Z/ q0 g3 [
  例:: w% k$ J+ e8 Z* i6 n# Y

/ z6 z* t4 J0 k  E4 BD A0        11100100 10111101 10100000  X7 C( b; _8 P9 P8 p0 W* A% Y' K/ z
1 f8 b6 W' ]! [! g/ O0 }5 g
  这是“你”字的UTF-8编码) H; c; y! a* M: J
9 J- R+ X" E" ]$ x, [& H. c: \
  4F 60          01001111 01100000
& E0 m* Q: J) _% Y
7 u/ P7 f6 ^2 S/ p  这是“你”的Unicode编码
! y8 ~' |# x% r4 ^! p8 L: z; t' e. E& s% X0 O. v" s( }
  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。* N0 @! [9 P" g- g  ^
0 T( K8 w8 n9 c+ o0 ]4 l; \
  以下是Unicode和UTF-8之间的转换关系表:, Q1 ^; d9 L1 Q' V6 Y
2 l2 f9 J: U% ]7 [+ t4 Q
  U-00000000 - U-0000007F: 0xxxxxxx
/ i+ q  _# }- C0 n- q9 p& @/ e* m* \- N
) E0 s, t, y: X% b$ u# b% z  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
' r5 z# z' _* j$ m* Q, b7 P# v# {" ~* D
  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
. I/ x7 M/ }* E$ S6 F) j7 }
) \  L1 k, T% [2 g; D( V6 N/ m( y  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx$ h" f, k7 {7 C& ?1 W2 [+ J$ Z
) u) O' C/ ~( w- V3 Q/ ?, m& A' N& [
  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
) E6 k; `% c: L+ d( z; d; v
# _! ?: D& q7 B7 ~6 q  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
& E3 |* C! e' ^0 h' C; j4 R+ Y( ?. k7 D
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。




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