例項詳細介紹各種字符集編碼轉換問題

2021-06-16 05:06:10 字數 2745 閱讀 8193

本文背景:

本人在程式設計時需要匹配字串,由此想到了如果檔案是各種字元編碼的話,匹配結果有可能不正確,那麼,如何判斷不同的字符集?如何在不同字符集之間做轉換?對於unicode編碼逐漸通用的情況下,我們軟體人員如何從容應對? 本文首先對常用字符集進行總結,然後在字符集的顯示及轉換上以例項介紹,最後總結了程式設計中遇到的編碼問題。

本文目的:

對字符集編碼做詳細介紹,關鍵配以例項講解,降低問題的複雜度。

本文內容:

1.    常用字符集分類

1.1 簡介

·        ascii及其擴充套件字符集

作用:表語英語及西歐語言。

位數:ascii是用7位表示的,能表示128個字元;其擴充套件使用8位表示,表示256個字元。

範圍:ascii從00到7f,擴充套件從00到ff。

·        iso-8859-1字符集

作用:擴充套件ascii,表示西歐、希臘語等。

位數:8位,

範圍:從00到ff,相容ascii字符集。

·        gb2312字符集

作用:國家簡體中文字符集,相容ascii。

位數:使用2個位元組表示,能表示7445個符號,包括6763個漢字,幾乎覆蓋所有高頻率漢字。

範圍:高位元組從a1到f7, 低位元組從a1到fe。將高位元組和低位元組分別加上0xa0即可得到編碼。

·        big5字符集

作用:統一繁體字編碼。

位數:使用2個位元組表示,表示13053個漢字。

範圍:高位元組從a1到f9,低位元組從40到7e,a1到fe。

·        gbk字符集

作用:它是gb2312的擴充套件,加入對繁體字的支援,相容gb2312。

位數:使用2個位元組表示,可表示21886個字元。

範圍:高位元組從81到fe,低位元組從40到fe。

·        gb18030字符集

作用:它解決了中文、日文、朝鮮語等的編碼,相容gbk。

位數:它採用變位元組表示(1 ascii,2,4位元組)。可表示27484個文字。

範圍:1位元組從00到7f; 2位元組高位元組從81到fe,低位元組從40到7e和80到fe;4位元組第一三位元組從81到fe,第二四位元組從30到39。

·        ucs字符集

作用:國際標準 iso 10646 定義了通用字符集 (universal character set)。它是與unicode同類的組織,ucs-2和unicode相容。

位數:它有ucs-2和ucs-4兩種格式,分別是2位元組和4位元組。

範圍:目前,ucs-4只是在ucs-2前面加了0x0000。

·        unicode字符集

作用:為世界650種語言進行統一編碼,相容iso-8859-1。

位數:unicode字符集有多個編碼方式,分別是utf-8,utf-16和utf-32。

utf-8:採用變長位元組 (1 ascii, 2 希臘字母, 3 漢字, 4 平面符號) 表示,網路傳輸, 即使錯了乙個位元組,不影響其他位元組,而雙位元組只要乙個錯了,其他也錯了,具體如下:

如果只有乙個位元組則其最高二進位制位為0;如果是多位元組,其第乙個位元組從最高位開始,連續的二進位制位值為1的個數決定了其編碼的位元組數,其餘各位元組均以10開頭。utf-8最多可用到6個位元組。

utf-16:採用2位元組,unicode中不同部分的字元都同樣基於現有的標準。這是為了便於轉換。從 0x0000到0x007f是ascii字元,從0x0080到0x00ff是iso-8859-1對ascii的擴充套件。希臘字母表使用從0x0370到0x03ff 的**,斯拉夫語使用從0x0400到0x04ff的**,美國使用從0x0530到0x058f的**,希伯來語使用從0x0590到0x05ff的代 碼。中國、日本和南韓的象形文本(總稱為cjk)占用了從0x3000到0x9fff的**;

由於0x00在c語言及作業系統檔名等中有特殊意義,故很多情況下需要utf-8編碼儲存文字,去掉這個0x00。舉例如下:

utf-16: 0x0080 = 0000 0000 1000 0000

utf-8:   0xc280 = 1100 0010 1000 0000

utf-32:採用4位元組。

優缺點:

·        utf-8、utf-16和utf-32都可以表示有效編碼空間 (u+000000-u+10ffff) 內的所有unicode字元。

·        使用utf-8編碼時ascii字元只佔1個位元組,儲存效率比較高,適用於拉丁字元較多的場合以節省空間。

·        對於大多數非拉丁字元(如中文和日文)來說,utf-16所需儲存空間最小,每個字元只佔2個位元組。

·        windows nt核心是unicode(utf-16),採用utf-16編碼在呼叫系統api時無需轉換,處理速度也比較快。

·        採用utf-16和utf-32會有big endian和little endian之分,而utf-8則沒有位元組順序問題,所以utf-8適合傳輸和通訊。

·        utf-32採用4位元組編碼,一方面處理速度比較快,但另一方面也浪費了大量空間,影響傳輸速度,因而很少使用。

1.2 按所表示的文字分類

語言 字符集 正式名稱

英語、西歐語 ascii,iso-8859-1 mbcs 多位元組

簡體中文 gb2312 mbcs 多位元組

正體中文 big5 mbcs 多位元組

簡繁中文 gbk mbcs 多位元組

中文、日文及朝鮮語 gb18030 mbcs 多位元組

各國語言 unicode,ucs dbcs 寬位元組

字符集編碼的轉換

在程式設計的時候,往往需要字符集間編碼的轉換,這就需要用到乙個函式,它就是iconv函式。iconv不是php的預設函式,需要先安裝後才能用。如果是在windows環境下,可以修改php.ini檔案,將extension php iconv.dll前的 去掉。關於如何使用,這裡可以舉個例子。如下 i...

各種字符集和編碼詳解

在計算機中,所有的資料在儲存和運算時都要使用二進位制數表示 因為計算機用高電平和低電平分別表示1和0 例如,像a b c d這樣的52個字母 包括大寫 以及0 1等數字還有一些常用的符號 例如 等 在計算機中儲存時也要使用二進位制數來表示,而具體用哪些二進位制數字表示哪個符號,當然每個人都可以約定自...

字符集編碼轉換輕鬆實現

在linux上進行編碼轉換時,既可以利用iconv函式族程式設計實現,也可以利用iconv命令來實現,只不過後者是針對檔案的,即將指定檔案從一種編碼轉換為另一種編碼。iconv函式族的標頭檔案是iconv.h,使用前需包含之。include iconv函式族有三個函式,原型如下 1 iconv t ...