获得本站免费赞助空间请点这里
返回列表 发帖

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:
/ S) |- e1 b: l# A$ D9 K
+ ?( i& u& ?9 k8 V% r) @2 L  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
# Y: B  f4 z( w% T% P  v6 k. \+ d
  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。2 v1 {" H3 m4 f" Y: @% Z
& G7 n4 W  t8 l0 b$ B' C
  2、台湾,香港等地使用的是BIG5编码
) x7 y9 ]  |1 n, M' ?
" B! s: F5 U& D. {( i, ^  3、日本:SJIS编码1 R+ G! y' g# ~6 X

8 d; ~+ a6 m! [8 g2 P. b& X- R% ^  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。! x3 G5 H4 n: l9 v

$ P5 s0 {4 Y8 q0 ?5 O0 ?7 y  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。8 S& {4 `" ?( f0 ^7 Z, h
' B% D  s9 y! ~: V; Q4 b
  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
$ d5 {& i" ~& i( G2 N6 f
( z: C. C  m- ]! J0 ~7 M2 I* ~  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面3 i/ U) O5 y( [

6 o) z8 T, a5 u' ]: P  g+ i  n  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+ ]  u$ S) u( |4 `7 n- D
* Y" ^, o# |6 r% I' _
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
; }* e3 A2 \# D+ b! ]: }" B. F$ U  s: D
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
3 Y5 h! P7 d; E( |* ?3 d, ?, ^: T# k, s4 \" f" i
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。, E+ e  D2 z, Q  q/ ~6 {1 n
* K! ?, P7 I, n  M1 {
  codepage=936 简体中文GBK
9 k; q* U8 @# R8 l9 [- o5 ~  y' ?" L6 [6 p, |+ ?. E# D
  codepage=950 繁体中文BIG5  Q. i* v# d2 d3 m$ J/ k* m
8 Y8 A1 t* e" O
  codepage=437 美国/加拿大英语
# w. _7 {, @* K% O' d- o5 s, }4 |: T; Q& p+ i3 y
  codepage=932 日文
7 w8 E; L! f/ u8 }3 x' S, Q! b$ c
* V3 P) d, u) U( V0 P* y8 r  codepage=949 韩文
& I1 u. E5 }- C& E/ h& f: O( c) i! ^" R/ B6 N
  codepage=866 俄文
) u+ l2 K3 N* g$ x  q' P, p+ g3 g- [, j6 i( y6 v1 t8 `) H
  codepage=65001 unicode UFT-89 l9 Y2 I* ?' h

6 X2 X: ^- K" q1 n  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。8 h7 H3 X. O/ [1 b7 h, O

" q$ j- \1 U# W0 X0 P7 `  从936中随意取一行,例如:
. r( S* s" G+ Q' `6 G, J
$ W& b8 D* O6 v: K; N0 {$ E  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH3 U8 t2 Z$ f3 ^

- D5 d& s4 _- U" W; E  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。1 {0 i# b; q: x

2 y# {9 G9 @, ?: a  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
$ x9 C# e1 |8 b* x+ h( P3 d( w2 Q4 k
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?8 M) L* }) I. w# M

7 ]2 C4 O' S! U! J- T5 P  例:
: K) L, T+ Q' u! C% I1 h! Q
# {' O4 J0 l! q$ I1 k7 D0 \  E4 BD A0        11100100 10111101 101000000 s8 Z- {4 F4 g6 |  q) I; k5 e
/ G1 B3 L7 T  e% z
  这是“你”字的UTF-8编码! n0 D" h. L* }6 X' \7 f/ a
4 `" [' r3 U3 B! [
  4F 60          01001111 01100000
$ ^. ]2 M4 _- k8 @' I1 [' n: r
0 T" h9 s9 b! |1 H; y  这是“你”的Unicode编码  s9 S+ y; i, _$ @
2 g' K& R1 B, H- c3 F3 R0 w! G
  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。1 B2 Y6 a8 l5 i; a
' n  u" Z6 `3 F0 @# W! r  c
  以下是Unicode和UTF-8之间的转换关系表:
' u/ G7 z% U4 X; K  }7 M5 t) T% c3 ?! A2 U9 C5 r
  U-00000000 - U-0000007F: 0xxxxxxx  N9 D4 f; C, i( _6 w5 `+ p
6 q: e0 L1 \! Q7 {
  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
" U) x0 P/ {' ~/ O# `
6 |+ Q* T' y* N( S5 a  y0 Z- R. M3 A  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
' K' V: i1 M. R; b0 Z
9 d: j2 \) S0 m6 n# j7 W. \; E3 g  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx6 n/ z5 }5 o: y9 G' o, W" w
7 z/ q0 X" Z' ?- G/ P7 s  u# N4 P
  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx4 r% G! ?% J2 Z2 ~

$ ]& g% L3 s$ `. S& S) W2 i  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx6 ^) p  @# j- m  S( M; V/ v# A
" a4 x; ~$ {% k2 n
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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