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

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

Unicode和UTF-8在制作网页中对于很多人不是很了解,到底是什么样的概念希望通过本文可以让大家了解,首先说明一下现在常用的一些编码方案:5 J, Q1 D% q9 M/ P

) I, u% X. B+ I2 M# @7 B! ]( W  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
/ v- a2 C: o$ {8 \' J+ b
  L, O2 {2 Z. C0 t% v2 Z! ?  最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号;95年重新修订了编码,命名GBK1.0,共收录了21886个符号。之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持 GBK18030编码。按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。
4 @3 M  T- b3 \+ V! Q5 B/ }& N  \/ F5 [* A" B7 n: e* [
  2、台湾,香港等地使用的是BIG5编码6 G$ k; _- e: d' ]7 `7 P

4 W& z1 R+ z! I: j/ G  3、日本:SJIS编码! w2 k* W! X7 w
$ Z) e' K- P+ ^! g8 H, k
  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
& w" {* O) c  ^* y" E
6 h4 [& j# S; _: a  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。那么Unicode是如何编码的呢? 其实非常简单。就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。* ]7 [" E: W( |; ~& a! j+ c( i
4 M. w2 @) l9 n! O
  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。, I% D# q- F! N

- ?, }0 q( c3 ^+ c( J  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面,转换到UCS-4只是简单的在前面加2个字节0。UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面! I" o% m3 z$ E. C4 Q" U& U8 g
2 v# y! ]1 J7 |- s0 L( W" b
  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF! d* e$ H# G7 ]& A

4 M# g) i# p; d1 O+ {7 U  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。那么既然统一了编码,如何兼容原先各国的文字编码呢?这个时候就需要codepage了。
& k8 ]% `/ J! D/ ]6 f9 v1 K) C9 ?# M+ o( M1 ]% l
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
5 Q# ^( z/ E4 Q4 z
9 ]0 v" b" P& @1 s! `: E. t  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表;以下是几个常用的codepage,相应的修改上面的地址的数字即可。' N# G1 S3 @& l8 J

4 }; k! s. H# ~8 V0 Z  codepage=936 简体中文GBK( ~  D. E, T- U! o. W5 _! W6 S
2 f( ~4 j# a# `$ Y, B1 B6 d
  codepage=950 繁体中文BIG5" M( y3 a5 T4 K( }

6 q0 f/ A) E# Q' E( V( F$ e9 v  ~  codepage=437 美国/加拿大英语
; h. y& D/ X! w) q5 y0 n  o4 `9 R) ~+ F- F6 z
  codepage=932 日文; A2 U$ Q; L8 I" t
) f" V* j2 j0 H2 N
  codepage=949 韩文
2 l- E* Z' J! B* _, @  ^# p) \- d2 \) J" [: V4 p
  codepage=866 俄文2 N; B4 }0 E6 s" s4 ^* w
/ j: @9 k* n. |& S$ Q6 K2 o. g
  codepage=65001 unicode UFT-8
4 h$ ^9 x0 l  y% U) j
9 I% L4 ?8 N  G; D8 t9 E( K  X  最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。6 k4 r7 Z# R9 P) |2 o, M& @' v

. a) N; u0 i* w! y, t: b+ C  从936中随意取一行,例如:
8 m. t/ H: U  C* d  O* T; @+ K# l& c- H$ K% g; `
  0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH/ a0 B9 U$ C. Y5 {
6 S: B6 E9 p; J
  前面的编码是GBK的编码,后面的是Unicode。通过查这张表,就能简单的实现GBK和Unicode之间的转换。7 s7 {5 A) S6 x2 T0 u" ~6 _5 [" v
+ X$ Y" n) F! V) Q6 l. ?% x
  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?) P$ N( C1 d/ o5 o( N8 v2 w& l( y

( f% M; i& B5 Y0 q2 o8 D" L3 Y  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。因此,才诞生了UTF-8。那么 UTF-8是如何编码的?又是如何解决UCS-2的问题呢?9 J0 v3 `/ i& q/ g
+ K! b3 F" Z8 o4 H: K: V( d4 G
  例:/ x% ?6 B7 N! y/ Q! \
3 t( T# n: B9 Y$ S& R. a. {' ^
  E4 BD A0        11100100 10111101 10100000
$ a! K+ ~+ V2 q1 X" l# v
5 P( A& ^8 q0 W  @! |! X$ ~5 i  这是“你”字的UTF-8编码# T' b/ D' J; G1 G6 x6 L
7 O8 v8 J$ H! b: p% X( |
  4F 60          01001111 01100000
+ t  l$ l) m4 @8 ?' u5 s! C& {+ C" J" @
  这是“你”的Unicode编码
2 N6 N2 [: [: z( g/ I5 Q/ r
0 P9 T4 n5 V/ e2 q  按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000,把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。
$ U7 V9 T9 |; ?3 n8 o; J, ^
" k$ z( h* e0 N; V  以下是Unicode和UTF-8之间的转换关系表:
5 o: _2 Z8 H- U0 J# R" R
/ |3 B6 i) g/ W! a$ a1 v( C. {  U-00000000 - U-0000007F: 0xxxxxxx# j8 E, L) Q% G. X
$ Q5 `; b# ^0 b" [
  U-00000080 - U-000007FF: 110xxxxx 10xxxxxx3 R  _3 l4 X, _+ E/ B

. V- m  U! y8 E; r" V  U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
/ H- D  ]9 ~* a0 G3 ?/ @* E3 h- }% x% X; D: r0 c; r( k# x
  U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
/ w( i$ |! @' x% G- P
2 P4 I. R( f, Q) M  U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+ n9 g' e8 H8 p! s) f1 M, a
+ m3 C6 @4 M- S/ `  U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx3 j3 }+ L  B: p: h

  F/ `. `; V$ v0 n( d, ?) i. @  Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

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