返回列表 发帖

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:  P; I5 {( A2 O6 o  I
% z$ a2 d- H+ P  b: p: B7 g& c
  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。  I4 `5 j2 M/ W

. O; a. p, ^8 b+ t# L4 U* U, \  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
# Y; x4 z4 y( x# \  Z
* v# q9 e! E5 _$ B& c. B9 X  2、台湾,香港等地使用的是BIG5编码
+ S) O/ N! l! T) a9 B4 o$ O3 ^  ?4 z( W
  3、日本:SJIS编码
2 ?( z$ X, }- M3 F5 \0 Q, G1 E$ F4 K! F/ U1 V0 H. v
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
$ A/ y; v7 E3 }( H/ U
# t) z* W. f8 x/ N' [$ S  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。5 w5 z4 J0 G2 a4 I" w8 l/ p0 `

# a4 m5 t1 }1 w' U$ h' t; _# m  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
! {/ o6 |" W! k2 u; u; p8 }" M0 p  @% S: F3 p! s6 s# a5 T) x
  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
6 a8 r6 O  o% K* x4 k# z3 C2 T
3 n7 j5 b9 t6 w; H' O4 [  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF7 ^7 O9 \) {# ]
8 B, k+ b  D% Z6 |* k2 x( t
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。$ r1 O$ }( `9 @& V4 @

; T; x2 Q$ n, o, }0 {. p  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
% }& e9 T$ o) T$ d( u$ Z2 y: a: Q, {4 l- A$ {4 i! o, C  }
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
& [8 R5 P! i0 L& r/ _$ n
% }8 w. l- x. @6 j8 e  codepage=936 简体中文GBK
# u! Z; Y5 W9 i+ _: \! P, W: ?! k; V" b; P9 e/ j
  codepage=950 繁体中文BIG5
' b: ]# L/ S1 y3 x1 {! L
9 J( X4 @! c8 P  T# r8 A/ j  codepage=437 美国/加拿大英语1 `& n. I& P' C9 [; |6 @. O+ X2 h
: U4 N! L3 x( ^1 S
  codepage=932 日文
% S6 P+ @! T, z+ \0 M2 N1 t" {+ Z! i4 \
8 h; `  ^1 J/ k  U$ x" `  codepage=949 韩文$ ?& @. [9 s' J

3 S+ M2 c4 m% J# e$ F# J. T  codepage=866 俄文
2 N1 v5 b, n$ u" D% d+ W
5 [) a. P* w, U! a4 ~$ X  codepage=65001 unicode UFT-8) j6 n7 W) O4 B, ]
+ r/ l4 f; L& E  X' e- E: d9 d
  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
! L7 p7 f/ j: @5 S8 @
# O/ V7 {  \; |, M4 i& _" X" j/ B, k  从936中随意取一行,例如:
/ ]2 ~9 r# i: j+ i/ I( o6 }0 B; r3 f% `
2 u; b0 a' \) m6 l  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH$ O! E* j4 }1 H/ n! B

3 `" v% V: f5 u. V" i  E% [  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
( v& \: ?$ X; H. q  q4 e( s7 h4 g& a
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?3 o* l1 X  u- h5 E3 ~

* C+ o2 g) |% d- h; C- J  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?& \8 P4 Z9 f6 F8 P. N
( M4 i! o# F+ U
  例:: e5 A8 w3 G. B1 `" A

/ I/ s* H  h7 B( V1 X3 k; E2 `  E4 BD A0        11100100 10111101 101000004 x6 X" B& o( R

% z, U/ {; V' W- m3 @, F8 {' O  这是“你”字的UTF-8编码
( r. c0 v7 l, M" A, M, B5 W" I$ r: f3 l, q0 y1 k( ?4 X3 u5 R7 h
  4F 60          01001111 011000002 Z" F# T% O1 [' L/ {

4 z/ w# R" q5 M. t  这是“你”的Unicode编码
' }: W2 D  Y" }; I! U2 }
: f0 M9 [/ ?7 U$ x. F! R" j7 ^  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。/ d8 ~8 i% ^. i" i# v7 v1 U9 O8 K

. M+ _1 Z  ?3 S8 e: [  以下是Unicode和UTF-8之间的转换关系表:7 r" {7 U, ]5 `9 d5 J
" {: [6 T( R8 t8 C  B
  U-00000000 - U-0000007F: 0xxxxxxx$ T9 U: {$ ~7 z# f  b3 ~9 C$ ~* K

* m$ Y, d/ Q. A( e6 ~) w  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx  [, @2 R( Z/ P: S! F

2 ~2 ?7 k! }3 l5 V% Q& S* R6 c  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
3 Z9 h1 n& s& U
6 s) a0 t0 {5 k8 w9 W- O  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx& ~: [% R6 U6 |' F

! o* P" d; b" D2 a- @+ a7 H  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
7 a) K7 l+ X2 z3 g' ~
8 N9 U, ^8 v1 a" f5 Z  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx/ b2 N+ l" e- @) `# d

' L* H( k3 r" R/ O& c. M; V  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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