返回列表 发帖

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:. Z0 L) E( f8 K0 r5 z- i
1 N8 @/ N+ N7 S/ u# R
  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。1 |9 k$ _/ l! s/ ]  s% F/ [
. h5 i2 {  _) X
  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
" z( {( h7 A" R  _% ]: f* P0 N# Y" S5 @7 P( Z4 z1 g
  2、台湾,香港等地使用的是BIG5编码
- n5 r; D5 n% a
) h) Y; S- J6 \  s  3、日本:SJIS编码' a2 u/ g8 D) J9 e% |5 t
( |! T" w, P2 @: G
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。. O5 f1 k& Z0 v* p1 U8 _

* F$ ^* H7 k1 |6 m* J% {: E9 f- z" E  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。
0 M. m; h/ @: Z( F
0 n5 i5 Z0 y0 Y, q9 Y  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。" ^# U; Y, g% R$ q# o# H

2 H2 i/ x/ ?$ ]+ t  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
* g3 f2 i& d0 g1 i" N* m: q3 Y" R8 G/ e  v- f, M
  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF& V) K/ t! n8 \) G0 q
3 ?1 W; J+ u- v* ^# l+ n
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
. O, x0 _! }' c3 o' q" T! ]& b( I# q4 Z( E
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
4 v8 o7 v& `# _! c
: P5 J" B2 A0 H- R% s/ ^. \. A) Y& C  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。" ]. n$ u  G5 f1 |- k8 Z
+ p) B+ m# i2 H
  codepage=936 简体中文GBK
7 Y8 z" Z. T5 P# ~
, i; l! w, }7 D8 q  codepage=950 繁体中文BIG55 W+ H/ M/ v- r
. n' X% f" M8 g3 `8 V+ q( u
  codepage=437 美国/加拿大英语
2 a5 n5 q7 m! y! ?2 O4 z' l
/ n/ b7 k1 B: e8 U! ^( x' H  codepage=932 日文  _& j0 j4 d7 y: N! @/ B; y4 B$ o
/ k- F( F3 g& A, w$ k
  codepage=949 韩文8 i. Y! W+ C# Q5 V1 u+ k+ Q
. Z1 O* u) i5 j* K/ W0 x8 ^
  codepage=866 俄文
* X+ `6 F1 o* f7 n4 t
# L: S) ~! F% t2 a6 p" D8 i- m9 {  codepage=65001 unicode UFT-8! S* ^1 E% a+ H6 E9 p
7 w, ?. ~" u) d5 d& r, I. X
  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
  j5 g# k" B- W. S) X, y
8 Y' w5 v3 P' p0 e. K* M, x' |1 x* L) V  从936中随意取一行,例如:# \: ]3 g, I# k2 M

' S( v7 i/ I, I0 h$ z) [4 @. s  t7 _  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
. l4 r0 T& h& u* P. i( ^8 ^& a. D/ N9 K7 x5 w
  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
, ~8 J' p& r; G6 w" n( C* d  v$ h4 f, w
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
" B; H: [- w3 Q. X8 T% v0 h0 _' k! C9 g, }+ Z
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?
0 I# S# u& x/ M2 I: f8 s2 a7 z
. G& u1 N5 S( ~  z( V  例:, A$ R: C; F0 p2 {1 s. T

, p8 g& [; U8 p; `  E4 BD A0        11100100 10111101 101000002 [# i% e1 N' s, J, X! m; P7 D( _
' Q, _  m' C) V8 g% J* l
  这是“你”字的UTF-8编码
; ]/ N' C( \' q8 H# J: f' w5 [! h* U( N2 i5 R) e7 S4 y
  4F 60          01001111 01100000
/ X. }$ `0 @9 _' `/ f) x+ d& E% ^
' C2 v6 ?: Q# b/ w4 {( G  k  ]2 W, b  这是“你”的Unicode编码
2 l0 ]# b6 {! j) x# N. R# G3 q& S
  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
1 ~. ]- E: n1 k5 k
. k. r4 e' E4 i: a6 D  以下是Unicode和UTF-8之间的转换关系表:# I# A5 Q1 k0 _! B, n' S
6 a: {& q) K. ]1 ?
  U-00000000 - U-0000007F: 0xxxxxxx
; s: S. ~0 N7 o# G$ _5 M9 E0 }- P. u
  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx- }/ }; t1 z# k+ ^$ P  O! u
+ l$ Q9 W4 j4 K# H& I
  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
' U' E* v$ w7 H+ {- c6 V. U8 q  ]/ A, p! i
  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx" G/ M' q4 T' w4 u: e" q" T8 W6 L* J

& j+ K( r3 O  y. Q; r; i  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
9 I* u* Y9 l- Y' I* `
6 p9 R" H' p  t. ~0 \  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ P+ t7 ~+ J$ Q, P& R/ u1 _: w) N+ f# |7 X" M: {' V
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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