返回列表 发帖

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:7 s2 X# `4 f# o# T
5 x  d$ A1 B1 B( G9 c4 B
  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。3 j- l- r9 J3 J+ q2 P& q0 d, J2 F

+ ^2 s7 n1 o1 {  S  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
- b8 _+ w7 \. Q1 r& i7 R# D4 u  H, U9 B" N3 P6 |
  2、台湾,香港等地使用的是BIG5编码! m" {3 q0 x1 h' L% \

8 T8 w6 U: g: L0 N  O, `5 `  3、日本:SJIS编码0 P2 b# e0 M4 ]1 I

% W) F8 @6 M7 E9 o9 n: O4 e* a  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
& H8 E, |$ n8 X! v2 [5 H8 U# u' e9 m2 a& H
  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。& N4 p  B5 E9 J  g) g

% P% w( p) O0 \( c# o  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
, y/ _2 T( S3 `  R
  S1 o' `7 r: _7 z" M  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面4 v$ [7 W) m* a& `: R3 u" C% Z1 x* d

- Z$ |" W, }) i& k* G  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
8 E6 F$ G$ c% M( y
* P5 f' E6 g6 ]4 Y, |( K  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
" @1 y# j# L! g  r& H2 u$ X7 u" N* R9 o' x0 |- R( v
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
! \1 g- t$ p0 |) b9 n$ p" ]  R6 y0 X8 H+ n8 v0 J
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
) c: h! m2 A% l8 ?- p* V! e$ h
  k$ I2 }# L1 b  |8 O$ Q- ~6 @  codepage=936 简体中文GBK
4 d6 J, f* D) C# D; i' C! E6 E2 w
  ^2 ^$ _& ?0 Z' Q9 ^  codepage=950 繁体中文BIG5
" R2 O' |8 `  Z9 L% @3 i1 ?) j. T$ _" j0 c1 M' K9 m/ N; p
  codepage=437 美国/加拿大英语% L+ p8 L7 ]) h: K0 ~9 p

* i) l1 @( |/ W5 M  codepage=932 日文) V! H( x" f+ p% a, T2 ~: F

+ ]+ q, x+ |- h4 d* |# k5 I# @) g  codepage=949 韩文7 ?# y" R2 v2 ]% f4 q1 }* C
* o  O  m6 b) d7 G) O7 ]4 ]; D
  codepage=866 俄文, E0 z" I  t5 b9 p( ]+ f

, D+ a/ a% n9 l3 I- p  codepage=65001 unicode UFT-8& Y; U; T. Q" _: A. X; y7 t

# w0 e8 N: u/ d6 `0 N7 v  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。& @: G2 W9 H) e7 C

, C0 C6 h4 w4 j. ^% C5 |9 A  从936中随意取一行,例如:5 L% ^  X5 v5 Q' N( i7 [- W* j0 y
! s6 O- M3 Q+ i+ |0 u
  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH+ V; p9 Z. _  H( Y4 y

9 k" Q) R1 I! R. z# J/ T+ Y  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。" ^; L3 E$ V# u& |
2 z, `# L5 q4 H: S! y* I% j* Z  Q
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?! ^4 r! |* z! i! J+ s
/ ]1 \& Z, t1 C
  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?, t; w& N3 z# o# X: l5 ]

. s% M+ A  q' H! w  例:
) k9 f) L8 S6 Y- a+ o6 t7 b; w* x( L1 b# L
  E4 BD A0        11100100 10111101 10100000
% ], A! d) ^9 N2 {$ z0 {/ c
. f- r* x+ P( Q& g  这是“你”字的UTF-8编码% O+ T4 U+ o9 S% z: p7 R

0 t2 ^0 H0 A3 o- d0 ]4 A. ^% o4 b3 P  4F 60          01001111 01100000
1 u) @- T0 k  p1 L2 L" V, R- i
8 X0 D0 i6 i, R( S' @  这是“你”的Unicode编码
: v$ F2 @' ?( H6 N+ l6 |" T" H" [: A+ N+ c. }" y; R
  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
0 C$ X9 a0 w% ^$ w8 f0 j6 t8 L% Z: c) o$ e& F; X9 b( Q, y
  以下是Unicode和UTF-8之间的转换关系表:
, m4 L  v0 m2 L3 C7 d
/ |$ S/ Y' p1 [! h  F  U-00000000 - U-0000007F: 0xxxxxxx
; W2 c9 _8 U1 ]. d+ o9 u' E$ A; [; J& v  r/ d, ~! f0 h
  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx6 A) Z5 S  G: ^: i9 a; \
* Q3 L4 P9 C6 _- ?* i0 q1 E+ O
  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
$ N" A4 W9 n7 X  c
( x4 D7 d: _* s- @  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
* {( E& V" J7 u* T, x
& C$ @. u; Q: m) ^  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx6 p- m1 d5 E4 t  R% m
/ W$ \% M; ~2 d  R! f
  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx: z% y: D5 V2 q0 k, n, G

( m0 y: }+ ~' X* M- w" @  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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