SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Unicode
Internationalization(i18n) and
Localization(l10n)
• Before Unicode
• Unicode
• 程式設計
• Before Unicode
• Unicode
• 程式設計
Before Unicode
•
•
•
•
•

ASCII
Big5
GB
Windows 1252
…
Before Unicode
ASCII共定義了128個字元,其中33個字元無
法顯示(這是以現今作業系統為依歸,但在
DOS模式下可顯示出一些諸如笑臉、撲克
牌花式等8-bit符號),且這33個字元多數都
已是陳廢的控制字元,控制字元的用途主
要是用來操控已經處理過的文字,在33個
字元之外的是95個可顯示的字元,包含用
鍵盤敲下空白鍵所產生的空白字元也算1個
可顯示字元(顯示為空白)。
Before Unicode
BIG5 碼系統為兩位元組之內碼系統,共可定義
19782 個字碼,其高、低位元組的範圍如下:
• 高位元組 0x81~0xFE
• 低位元組 0x40~0x7E、0xA1-0xFE
其第一位元組的值在 16 進制的 A1~FE 之間, 第
二位元組在 40~7E 和 A1~FE 之間。因此,其
第一位元組的最高位元是 1, 第二位元組的最高
位元可能是 1,也可能是 0。Big5 在上述範圍
內,規劃出標準字(STDFONT)、特殊符號
(SPCFONT、SPCFSUPP)及使用者造字
(USRFONT)的區域。
Before Unicode
BIG5 的 Unicode 補完計畫
• Unicode補完計畫只是補字,並沒有解決亂
碼、字碼不足的問題。
• 字碼並不完全與 Unicode 相同,因此,在
使用了補完計畫裡的某個字以後,在其他
人電腦上不一定能看到,必須對方也安裝
補完計畫才行。
Before Unicode
GB(GB2312/GBK)
• GB2312是GBK的一個子集,GB2312編碼範圍是
0xA1A1 - 0xFEFE ,如果是純粹的 GB2312編
碼,處理起來很簡單。GBK 採用雙字節表示,編
碼範圍為 8140-FEFE,首字節在 81-FE 之間,
尾字節在 40-FE 之間,剔除 xx7F 一條線。總計
23940 個碼位,共收入 21886 個漢字和圖形符
號,其中漢字(包括部首和構件)21003 個,圖
形符號 883 個。
Before Unicode
問題
• 對拉丁語系來說,字碼足夠,但是在跨國
對拉丁語系來說,字碼足夠,
使用時,會遇到內碼重複。
使用時,會遇到內碼重複。
• 對東亞來說,字碼不足,無法表達所有
對東亞來說,字碼不足,
以中文來說,
萬字。
字,以中文來說,就超過 2 萬字。
• 程式處理不易。
程式處理不易。
Unicode
Why Unicode?
隨著電腦功能的日趨強大與價格的日趨便宜,其應用領域也越來越廣。
但是隨之而來的各種編碼需求,卻使得單一位元組的編碼方式,因編
碼空間太小,變得不足以因應各種應用程式的需求。中文字、排版系
統的標誌符號、非英語拼音字母和圖形符號等的編碼,需要使用2或
多個位元組來編碼。同時,為了預防這些多位元組字元 碼被電腦或網
路設備「吃掉」其中的某個位元組,編碼時必須避開每個位元組的0
~32和127這34個控制碼。這種做法嚴重浪費編碼空間,就多位元組
擴充編碼的國際標準ISO2022而言,兩個8位元的位元組只能提供最
多188個控制字元和35,344個文字形符號的編碼空間, 共計35,532個
編碼位置,但是16個位元的編碼空間事實上高達65,536。兩者相比
較,ISO2022的16位元編碼只能達到最大編碼空間的54%,顯得利用
率很差。同時在應用層次的編碼,由於廠商眾多又缺乏共識,往往你
編你的碼、我編我的碼,其後果則是引發萬碼奔騰的亂象。
Unicode
源由
1988年初,美國Xerox公司的Joe Becker倡議以新的編碼結構,另外編
訂世界性字元編碼標準:將電腦字元集編碼的基本 單位由現行的7或
8個位元一舉擴充為16個位元,並且充分利用65,536 個編碼位置以容
納全世界各種語言的字元和常用符號。新的字元集 編碼標準被命名為
“Unicode”。一群來自Xerox公司和Apple 公司的工程師組成工作小
組,負責Unicode的原始設計工作。1991年 元月,十多家電腦硬軟
體、網路和資訊服務業者,包括:IBM、DEC、 Sun、Xerox、
Apple、Microsoft、Novell名公司,共同出資成立 Unicode協會(The
Unicode Consortium),並由協會設立非營利的 Unicode公司。
Unicode協會成立之後,將原先的工作小組擴編為 Unicode技術委員
會(Unicode Technical Committee),專責Unicode 的字元搜集、整
理、編碼等工作。推動Unicode成為國際標準的工作, 則由Unicode
公司負責。目前最新版本為第五版。
• Before Unicode
• Unicode
• 程式設計
Unicode
種類:
• UCS-4
• UCS-2
• UTF-8
• UTF-16
• UTF-32
Unicode
UCS-4
Unicode
UCS-2
0000h 字面稱為基本多語文字面(Basic Multilingual Plane, BMP).當電腦系統只使用
BMP 字元碼的時候,可以省略 G-octect 與
P-octect, 所以就變成 16 bit,稱為
ISO10646字元碼的基本面形式(即 UCS-2 ).
Unicode
UTF-8
範圍:0x000000~0x1fffff
不定長度,轉換以後可能是 8 bit, 也可能是 16
bit 或 24 bit 或 32 bit。主要將原本是 32 bit
的 ucs-4 拆成 4 個 byte,以利於傳輸。
Unicode
Unicode
UTF-16
範圍:0x00000~0xfffff
規則:未超過 0x10000,以一個整數(2 bytes)
表示;大部分的字都被包含在一個整數(2
bytes)裡,等同是 UCS-2 。超過,則減去
0x10000,得到 20 bits整數,然後拆為兩
個 10 bits(假設為w1、w2),接著
110110+w2,110111+w1,得到兩個整
數。
Unicode
UTF-16
Unicode
UTF-32
主要用來節省空間用,基本上是 UCS-4的子
集合。
•
•
•

Before Unicode
Unicode
程式設計
程式設計
內碼轉換
• 自製對照表
• Windows API ( MultiByteToWideChar、
WideCharToMultiByte )
• libiconv
(http://www.gnu.org/software/libiconv/)
程式設計
字元、字串的表示
• ASCII: char s[]=“Hello world!”;char c=‘c’;
• Unicode: wchar_t s[]=L”Hello world!”;
wchar_t c=L’c’;
• Windows: TCHAR s[]=TEXT(“Hello
world!”); TCHAR c=_T(‘c’);// 或使用 _T()
替代 TEXT()
程式設計
字串處理
• ASCII (char):strcpy(), strcat(),
strcmp()…
• Unicode (wchar):wcscpy(), wcscat(),
wcscmp()…
• Windows:可使用 TCHAR 並定義
_MBCS或_UNICODE表明使用 double
byte 或 unicode,然後調用 _tcscpy(),
_tcscat(), _tcscmp() ….
程式設計
輸入、輸出
• ASCII:printf(), scanf(), fwprintf()…
• Unicode: wprintf(), wscanf(), fwscanf()…
• Windows: _tfprintf(), _tscanf(), _tfprintf()…
使用前,同樣也要 #define _UNICODE、
#define UNICODE
程式設計
資料庫
• MS SQL: nvarchar, nchar
• MySQL: 建立 Database、Table 與連線時
就需要指定使用編碼
• SQLLite: Unicode base
程式設計
其他OS的處理方式
• 型別大同小異,只要能容納字碼大小即
可。如 nVidia SDK 的 dbl_chr。typedef
unsigned short dbl_chr;
• 字串的處理也多半會提供適當的字串處理
函式。如 nVidia SDK 的 d_strcpy(),
d_strcat(), d_strcmp()…
程式設計
• 編碼自動偵測
– 文字檔 (BOM): UTF-16(LE) FF FE、UTF-8 EF BB
BF…
– html/xml

• 可能做到嗎?你已經在使用了,大多的Browser
都提供了此功能。
• Mozilla 有開源此函式庫:Mozilla Charset
Detectors
http://www.mozilla.org/projects/intl/chardet.html
• enca (http://trific.ath.cx/)
程式設計
Localization
• locale.h,提供設置本地化語系的相關函式,如
setlocale()、newlocale()、freelocale() …
• 對照表,通常以英文當作原始字串,再依照
Locale 設定來傳回對照的字串
• Windows,原理一樣,但多半將字串放在資源檔
裡。
• Linux,使用 gettext 函式庫,並有工具可自動收
集需要作本地化的字串,或作翻譯。
程式設計
字型顯示
• 泰文與希伯來文
• 動態組字
(http://zh.wikipedia.org/wiki/%E5%8B%95
%E6%85%8B%E7%B5%84%E5%AD%97)
程式設計
輸入法
參考資料
•
•
•
•

•
•
•
•

•
•

ASCII - Wikipedia http://zh.wikipedia.org/wiki/ascii
由方方土探討Big5e http://netlab.cse.yzu.edu.tw/~statue/freebsd/hanzi/examp/
关于GB编码的一些常识 - 字符编码
http://blog.chinaunix.net/u2/66172/showart_557975.html
Unicode補完計畫 – Wikipedia
http://zh.wikipedia.org/wiki/Unicode%E8%A3%9C%E5%AE%8C%E8%A8%88%E7%
95%AB
Unicode與ISO10646(上)(作者:曾士熊)
http://www.ascc.sinica.edu.tw/nl/89/1610/02.txt
Unicode與ISO10646(下)(作者:曾士熊)
http://www.ascc.sinica.edu.tw/nl/89/1611/02.txt
UTF-16 - Wikipedia http://zh.wikipedia.org/wiki/UTF-16
RFC 2781 - UTF-16, an encoding of ISO 10646 http://tools.ietf.org/html/rfc2781

谈谈Windows程序中的字符编码(1) >>> 致力于编码技术发展
http://www.utf.com.cn/article/s13
ruby character encoding detection http://blogger.godfat.org/2008/06/rubycharacter-encoding-detection.html
參考資料
•
•

•
•

親手打造 GNU/Linux 中文環境 (五) - 訊息國際化的解決方案 (gettext 簡介)
http://cle.linux.org.tw/xcin/i18n/pc2000/p5/index.html
Byte-order mark
http://en.wikipedia.org/wiki/Byte_Order_Mark#Representations_of_byte_order_marks
_by_encoding
ANSI C X3.159-89 標準 http://phi.sinica.edu.tw/aspac/reports/95/95002/appendixa.html
setlocale, _wsetlocale (CRT) http://msdn.microsoft.com/enus/library/x99tb11d(VS.80).aspx

Contenu connexe

Similaire à Unicode

python中文处理
python中文处理python中文处理
python中文处理roamin9 Zhou
 
Character Encoding and Database Transcoding Project
Character Encoding and Database Transcoding ProjectCharacter Encoding and Database Transcoding Project
Character Encoding and Database Transcoding ProjectHo Kim
 
Character Encoding - Concepts and Practices
Character Encoding - Concepts and PracticesCharacter Encoding - Concepts and Practices
Character Encoding - Concepts and Practicesrogeryi
 
02.python基础
02.python基础02.python基础
02.python基础modou li
 
中文编码问题
中文编码问题中文编码问题
中文编码问题dynaturtle
 
2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享Jen Yee Hong
 
Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Dahui Feng
 
Hcsm lect-20120913
Hcsm lect-20120913Hcsm lect-20120913
Hcsm lect-20120913lusecheng
 
编码大全 拔赤
编码大全 拔赤编码大全 拔赤
编码大全 拔赤jay li
 
Binary exploitation - AIS3
Binary exploitation - AIS3Binary exploitation - AIS3
Binary exploitation - AIS3Angel Boy
 
[科科營]電腦概述
[科科營]電腦概述[科科營]電腦概述
[科科營]電腦概述nctutlc2013
 
Talking about exploit writing
Talking about exploit writingTalking about exploit writing
Talking about exploit writingsbha0909
 

Similaire à Unicode (13)

python中文处理
python中文处理python中文处理
python中文处理
 
Character Encoding and Database Transcoding Project
Character Encoding and Database Transcoding ProjectCharacter Encoding and Database Transcoding Project
Character Encoding and Database Transcoding Project
 
Character Encoding - Concepts and Practices
Character Encoding - Concepts and PracticesCharacter Encoding - Concepts and Practices
Character Encoding - Concepts and Practices
 
02.python基础
02.python基础02.python基础
02.python基础
 
中文编码问题
中文编码问题中文编码问题
中文编码问题
 
2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享2016-04-07-清大-國際化開源專案技術實務與經驗分享
2016-04-07-清大-國際化開源專案技術實務與經驗分享
 
Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化Linux必备知识与Unix基础文化
Linux必备知识与Unix基础文化
 
Hcsm lect-20120913
Hcsm lect-20120913Hcsm lect-20120913
Hcsm lect-20120913
 
编码大全 拔赤
编码大全 拔赤编码大全 拔赤
编码大全 拔赤
 
Binary exploitation - AIS3
Binary exploitation - AIS3Binary exploitation - AIS3
Binary exploitation - AIS3
 
[科科營]電腦概述
[科科營]電腦概述[科科營]電腦概述
[科科營]電腦概述
 
Encoding
EncodingEncoding
Encoding
 
Talking about exploit writing
Talking about exploit writingTalking about exploit writing
Talking about exploit writing
 

Unicode