字符編碼Unicode、UTF-8和ANSI

ANSI、UTF-8、Unicode為字符代碼的三種編碼格式,一個字符可以被編碼成ANSI、UTF-8或Unicode格式,這三種格式只是表現形式不一樣,其表示內容是一樣的。

ANSI、UTF-8、Unicode


ANSI、UTF-8、Unicode為字符代碼的三種編碼格式,一個字符可以被編碼成ANSI、UT-F8或Unicode格式,這三種格式只是表現形式不一樣,其表示內容是一樣的。如下表:

char ANSI(GBK) Unicode UTF-8
0xD6D0 0x4E2D 0xE4B8AD

ANSI編碼

ANSI表示英文字符時用一個字節,表示中文用兩個字節

為了使計算機支持多種語言,不同的國家和地區制定了不同的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼標準。這些使用 2 個字節來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文操作系統下,ANSI 編碼代表 JIS 編碼。

對于ANSI編碼而言,0x00~0x7F之間的字符,依舊是1個字節代表一個字符(ASCII編碼),而這之外的字符通常是使用0x80~0xFF范圍內的兩個字節來表示一個字符。比如漢字找那個的'中'在簡體中文中使用[0xD6, 0xD0]這兩個字節存儲。

下表中展示了在不同ANSI標準下的編碼:

char ANSI(GBK) ANSI(Big5) ANSI(JIS) Unicode UTF-8
0xCEC4 0xA4E5 0x95B6 0x6587 0xE69687

可以看出,不同ANSI編碼之間互不兼容,當信息在國際間交流時,無法將屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。需要將不同的ANSI編碼都轉換成UTF-8編碼,進而存儲

Unicode編碼

Unicode字符集編碼全稱:Universal Multiple-Octet Coded Character Set,通用多八位編碼字符集。Unicode字符集是國際組織制定的可以容納世界上所有文字和符號的編碼方案。

Unicode編碼使用兩個字節(0x0000-0xFFFF)來表示一個字符,世界上任何文字和符號都對應于Unicode字符集中的一個二進制代碼,但是:

Unicode只是一個符號集, 它只規定了符號的二進制代碼, 卻沒有規定這個二進制代碼應該如何存儲。

Unicode編碼的優點是覆蓋了世界上所有的文字和符號,缺陷則是對于英文字符浪費了一個字節。例如:英文A在unicode中表示為0x0041。

UTF-8編碼

UTF-8是Unicode的實現方式之一。

UTF-8全稱:8bit Unicode Transformation Format,8比特Unicode通用轉換格式。UTF-8是一種針對Unicode的可變長度字符編碼。可以表示Unicode標準中的任何一個字符,且其編碼中的第一個字節仍然與ASCII兼容。

UTF-8是一種變長的編碼方式,可以使用1~6個字節對Unicode字符集進行編碼,編碼規則如下:

  1. 對于單字節的符號, 字節的第一位設為0, 后面7位為這個符號的unicode碼. 因此對于
    英語字母, UTF-8編碼和ASCII碼是相同的.

  2. 對于n字節的符號(n>1), 第一個字節的前n位都設為1, 第n+1位設為0, 后面字節的前
    兩位一律設為10. 剩下的沒有提及的二進制位, 全部為這個符號的unicode碼.

n Unicode符號范圍 UTF-8編碼方式
1 0000 0000 - 0000 007F 0xxxxxxx
2 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
3 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 0020 0000 - 03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 0400 0000 - 7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

注:在UTF-8編碼中,英文字符占一個字節,中文字符占用3個字節。

總結

1、中文操作系統默認ansi編碼,生成的txt文件默認為ansi編碼。

2、國際文檔(txt和xml)使用unicode編碼是正宗做法;操作系統和瀏覽器都能夠“理解”unicode編碼。瀏覽器“迫于壓力”才“理解”utf-8編碼。但是,操作系統有時只認unicode編碼。

3、Windows記事本有四個編碼選項:ANSI、Unicode、Unicode Big Endian和UTF-8。

  • ANSI是默認的編碼方式。對于英文文件是ASCII編碼,對于簡體中文文件是GB2312編碼(只針對Windows簡體中文版,如果是繁體中文版會采用Big5碼)。
  • Unicode編碼指的是UCS-2編碼方式,即直接用兩個字節存入字符的Unicode碼。這個選項用的little endian格式。
  • Unicode big endian編碼與上一個選項相對應。采用big endian格式。
  • UTF-8指帶BOM 的UTF-8。

ANSI、UTF-8、Unicode轉換


Windows Unicode and Character Sets

Unicode編碼字符集是最通用的字符編碼標準,Windows應用程序使用Unicode字符集的UTF-16實現版本。同時,Windows也支持傳統的字符集:單字節字符集(Single-byte character sets, SBCS)和多字節字符集(Multibyte character sets)。

很多Windows API函數擁有“A”和“W”版本,“A”版本基于Windows Code Page,而“W”版本則基于Unicode字符。應用程序可以通過WideCharToMultiByteMultiByteToWideChar兩個函數來轉換Unicode字符串和基于Windows Code Page字符串。雖然函數名中含有“MultiByte”,這些函數實際上能處理SBCS、DBCS和multibyte character set Code page。

編碼轉換

在Windows平臺下,ANSI、UTF-8、Unicode三者之間的轉換主要依賴于WideCharToMultiByteMultiByteToWideChar兩個函數。

  • Unicode轉UFT-8:設置WideCharToMultiByte的CodePage參數為CP_UTF8;
  • UTF-8轉Unicode:設置MultiByteToWideChar的CodePage參數為CP_UTF8
  • Unicode轉ANSI:設置WideCharToMultiByte的CodePage參數為CP_ACP;
  • ANSI轉Unicode:設置MultiByteToWideChar的CodePage參數為CP_ACP;
  • UTF-8轉ANSI:先將UTF-8轉換為Unicode,再將Unicode轉換成ANSI;
  • ANSI轉UTF-8:先將ANSI轉換為Unciode,再將Unicode轉換成ANSI。


本文內容應該存在錯誤或者是以偏概全的問題,后續會繼續深入了解。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 0 前言 在平時的開發過程中大部分人應該都遇到過中文亂碼問題,瀏覽網頁時也會遇到內容顯示亂碼的情況,一般遇到這種情...
    小豬啊嗚閱讀 2,650評論 1 10
  • 字符集和編碼簡介 在編程中常常可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 8,614評論 0 13
  • 4月休息的時候就思考過以后的方向,甚至為此咨詢過朋友,大家給的建議基本上和我心里的想法一致——繼續我的兒童教育工作...
    悅心0516閱讀 1,947評論 1 4
  • es6中新增了set類型的數據,自動去掉重復的數據 Array.from()的作用是是可以把類數組對象轉化為數組。
    Sccong閱讀 954評論 0 0
  • Dead Men Tell No Tales “who am I to you?” “treasure.”
    Yadyfly閱讀 357評論 0 0