返回列表 发帖

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:
7 @* m& W4 v. ^1 m5 ^' ]4 ]6 C+ Y9 C9 i+ N# T  W
  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。- o. U0 z$ G% @$ P9 T
/ m* V0 K! P9 ^! j  P
  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。( n, u- }. [5 C& D
+ r+ M! N4 S% d3 G' A* Z
  2、台湾,香港等地使用的是BIG5编码# k' `% Q) s/ k5 V5 k3 _1 l
( x  \) ?! M3 t: o5 Q8 I  E
  3、日本:SJIS编码
( N) h5 W5 v$ C5 }2 D1 l( t' q2 {, B  d" L' r
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。. _0 m9 ?3 Z5 i6 B

; G* j, [# C5 d4 D! x$ M5 t4 T3 U* p  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。
+ j" C- `9 v; S9 K! z) n5 {* u  a* G# ?5 a  z; ~
  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。  W' D5 |. }9 u* p
' d! ^+ }( T2 U4 o/ o
  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面0 s7 u: R- I/ @/ y& o$ I# [

# E) \: p- N% m# |5 b  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  y, b/ z5 J1 w* b9 x
4 R1 `% R- y1 B/ W  @9 ^/ p$ f
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。1 P) ~( J6 }0 d# w# F8 b, @
8 X9 e# a% G: ?
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
5 r4 N; ]; {1 c6 t( z0 S# V9 L( ]' v! }
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。7 n! v/ k7 y' z# L5 i
: B7 P( L: T( @( }# h
  codepage=936 简体中文GBK7 t3 B' r* r, m- n  [

% q4 H' q1 x( Y0 m8 b* q* q) ^  codepage=950 繁体中文BIG5
9 n8 L  P, _6 ]. R9 B' J% H, U, ]/ G" r
  codepage=437 美国/加拿大英语: k) V2 E* a* c* a

" l$ _5 w0 N' @/ x- H' _  codepage=932 日文
9 _- ]0 E& b# m: T3 g! t
9 h  o$ `; ]( Z6 N  codepage=949 韩文2 U' A7 ?0 J7 A. r' y+ C

2 O3 [% b8 c: S  codepage=866 俄文
; K% I* H+ D) V8 h9 T3 _) R. {# z) Y
  codepage=65001 unicode UFT-8
9 ~0 `& N: b% `* m
/ u1 q% v, U. @# a  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。
' l2 P" u, k0 C8 E
/ j! a$ X( q0 D. O% X; ^2 k  从936中随意取一行,例如:
$ J! n, u! C+ L
3 f/ l  c% G  L- r  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH2 \: e& A6 z" C4 o

+ [9 |* m) n# f8 x8 a  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。( E7 i3 q$ W0 |9 ^' \0 I- [$ O1 D9 f

. n( e& l) p: I6 j/ u3 q9 H( f+ Q  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?* k7 h' `1 D( ?) Z7 n

( a* T, q7 o5 @. |  O& j+ T  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?
# |' F& M5 Q9 ~7 S# p: ]  b9 ]9 b+ ^# @( ~3 F5 Z
  例:
  t6 j4 T# K; i- q: N; j$ J% v' G( I$ \$ u+ X+ R
  E4 BD A0        11100100 10111101 10100000* _. j, \: }6 ^3 G5 C

, g" [$ v" ~; a  这是“你”字的UTF-8编码2 i- a5 w/ P6 g+ x# D! g3 y1 G
; Q/ b* f7 I- t- ~4 q
  4F 60          01001111 01100000
9 Z/ ~. Q! F  D
+ P( I! P% f- e8 z# {0 O' }  这是“你”的Unicode编码/ l. a- o0 p/ |( p9 ]9 R& E

/ p: l5 L: \3 T" [. R% r% i% Q  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。. Y" n3 t1 R" p% L0 r
% N0 l# B9 H; V
  以下是Unicode和UTF-8之间的转换关系表:5 A* W4 T3 E, e6 r1 M
/ @9 Z' F5 m" C. [- U
  U-00000000 - U-0000007F: 0xxxxxxx
( O; Y( g6 K9 V5 I2 r. G- A
1 `* d8 M4 E6 ]$ c6 G; [- i5 H  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx" O& ?1 S9 D+ x0 \( D+ y' e/ H

! m" e6 ~5 ~7 A  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
: z3 F9 U$ Z" Z" z$ `8 Q2 D
4 K# K- N! W6 N% R) u1 D  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
' q: u/ O8 D. W/ }: \2 k/ c0 a! ^9 h2 x7 h: m! T  |' t
  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
/ K* s' t+ t5 u% D3 B
0 k3 p4 X  b6 U. K6 K. n  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx" y" R$ u$ E  b" A/ O$ @3 B
- Z3 C: W, s$ E3 V! i% v
  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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