返回列表 发帖

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:. Z' d3 Y: i; H2 r' E4 k

/ h/ i+ O" K8 T: W! F7 H" m  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。& ^2 Y1 J  m- X9 `2 B' K

3 ?% d3 v% Q, Z# u4 C/ E  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
2 J6 c- o' t3 ^9 |  u
( I" h( A+ U8 I$ q  2、台湾,香港等地使用的是BIG5编码6 |" Y7 S% V; F9 T6 M" l, I3 ^2 m
2 v( d: T% C( J$ Q( n8 E
  3、日本:SJIS编码
" G* a+ ~0 o: l6 g7 Y; Q# a9 u4 N2 U2 F: T" K; [/ {! p3 p
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。) \% a* t, V7 D8 a
  i8 S9 T4 b" R3 L
  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。! K( |+ W( o1 r/ V- L) ^3 ]: N6 r' R

8 I/ S  c  N" f) Q4 U; V8 Y7 I  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
7 p& ^3 `% W9 ~7 j9 y; f: d; C
* [- f, r3 a. m3 w: d. Z: U  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
0 o- U9 k6 O& i& o( L2 y5 y6 {7 s! d4 y- H/ |7 m" e
  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
. Y* j2 @  S# V/ O0 f1 N: _
, X' c) Y# w/ u$ A/ v* M5 g  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
7 Q# i& p3 X. [/ Z3 R; r- x6 j8 k" {/ O4 ^
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
0 x( C$ H3 V' _2 d4 [. S/ }* V3 M: l6 P. x' d
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。
2 ~1 o' G$ j/ G$ q$ I5 Y* a
# B$ ?. E6 {: p. z$ a9 C4 J  codepage=936 简体中文GBK
( z; c$ d* M' H% C
# v9 }# g) E. |0 w6 L9 Y  codepage=950 繁体中文BIG5' I5 U* N7 q7 x  N

% z! G" H, i/ N% Y# @  codepage=437 美国/加拿大英语
# e3 o( Z0 i. l: k8 r
* [- R* H- e! u$ v1 T  codepage=932 日文
) f- a1 f5 K% A5 S5 j! u7 y, H5 A2 C. \3 `2 P% m! u
  codepage=949 韩文
$ u' s8 T3 O/ R2 {
8 X, P9 K; v$ r5 s5 c$ q- h3 j3 ]  codepage=866 俄文( b  H+ Z6 ~7 P3 p

* L5 D( ]$ J# G1 V9 m  codepage=65001 unicode UFT-8
2 x* i: P3 Q. z. s7 r$ g  `* V8 ]9 |3 X4 W  Z8 P* [* E
  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
4 D% P: v# J1 ~+ K2 }/ V0 u# T( ?8 t
  从936中随意取一行,例如:
+ o8 h# C8 ~7 g3 E8 p+ l7 Y' v3 @( ~7 P+ T% e9 Y. L2 m3 {
  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
5 j- \5 k* I* g, [! ~
' [3 y$ N) C  t( y# Q$ B  y/ @  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。
" q, ?% F5 Z1 p- a7 f% C& J8 F$ K
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?
5 t; Q$ V; X7 t# T( B- u# H
# h  k) p3 _' J+ ~  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?2 T  O. \: N1 k- K5 u, ?' \6 ]
3 K* ]9 w6 c/ S; r6 O, M7 {
  例:7 X$ A7 j" v$ i: `2 X
& A/ q+ N9 b3 ~" a1 U6 ?# ?' j2 J) X
  E4 BD A0        11100100 10111101 10100000+ g: H+ Y& q8 r* t  Q
# G3 r4 q3 C+ Q# g$ ~3 |
  这是“你”字的UTF-8编码
. a; i8 u/ U- G6 ^' A$ x% n9 u& a$ e& `
  4F 60          01001111 01100000
9 x$ w) [( H8 F! z( ?4 u! D6 J
  Q9 C0 d) Q0 [  这是“你”的Unicode编码
& T& {# D& P1 _% T
* d" l7 w% p3 R) P8 W8 x  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
- M. g; W  X/ s
( B, ~5 b; E0 C7 K  以下是Unicode和UTF-8之间的转换关系表:5 F/ s* {4 O* z
# d" J% n' B/ B* n8 ~
  U-00000000 - U-0000007F: 0xxxxxxx
4 o3 m4 u% G* \; G9 a4 [, x# C, d7 q* v; p8 R
  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
# N+ @  Z- c* o( d3 p/ J2 z+ @. t2 t" O8 |) u: s
  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx' Q3 l; \9 L1 }
- i" \, _7 Y. O4 [# i0 I/ f: X$ }
  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
9 s6 B7 e) b8 H1 I
; f$ b) S2 D  N1 a; [( z  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  i* O$ ^- S% g0 f7 ?" Q! a. Q. X3 R7 ~8 R0 @
  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1 m  C8 u. D: }+ O+ b% L% l, U2 {$ y) e6 ~+ E
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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