libiconv

由於歷史原因,國際化的文字常常由於語言或者國家的原因使用不同的編碼。

歷史簡介

隨著網際網路時代的到來,通過網際網路進行文字交流也逐漸增多:瀏覽外國的網站,這個時候字元編碼的轉換變得尤為重要。這帶來了一個問題,就是許多字元在某一種編碼方式中沒有。為了解決這種混亂,Unicode的編碼方式被建立。Unicode是一種超級編碼包含了所有這些編碼的字元集,因此一些新的文本格式像XML的默認編碼方式就是Unicode.

但是很多老式的計算機還在使用當地的傳統的字元編碼方式。而一些程式,例如郵件程式和瀏覽器必須能在這些不同的用戶編碼之間作轉換。其他的一些程式則內置支持Unicode,以順利支持國際化的處理,但是仍然有在Unicode和其他的傳統編碼之間轉換的需求。GNU的libiconv就是為這兩種套用設計的編碼轉換庫。

編碼簡介

libiconv庫 為需要做轉換的套用提供了一個iconv()的函式,以實現一個字元編碼到另一個字元編碼的轉換。

包括的編碼有:

歐洲語系 ASCII, ISO-8859-{1,2,3,4,5,7,9,10,13,14,15,16}, KOI8-R, KOI8-U, KOI8-RU, CP{1250,1251,1252,1253,1254,1257}, CP{850,866}, Mac{Roman,CentralEurope,Iceland,Croatian,Romania}, Mac{Cyrillic,Ukraine,Greek,Turkish}, Macintosh
猶太語系ISO-8859-{6,8}, CP{1255,1256}, CP862, Mac{Hebrew,Arabic}
日文EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1
中文EUC-CN, HZ, GBK, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, ISO-2022-CN, ISO-2022-CN-EXT
朝鮮文EUC-KR, CP949, ISO-2022-KR, JOHAB
亞美尼亞語ARMSCII-8
格魯尼亞語Georgian-Academy, Georgian-PS
塔吉克語KOI8-T
泰國語TIS-620, CP874, MacThai
寮語MuleLao-1, CP1133
越南語VISCII, TCVN, CP1258
特殊平台HP-ROMAN8, NEXTSTEP
全部Unicode UTF-8, UTF-7 UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE C99, JAVA

全部Unicode,在uint16_t或uint32_t方面(使用機器相關的位元組序和對齊方式):
UCS-2-INTERNAL, UCS-4-INTERNAL
本地依賴,在'char'或'wchar_t'方面(使用機器相關的位元組序和對齊方式,以及系統和區域相關的語義):
char,wchar_t 
空的編碼名""等同於"char",它表示與區域相關的字元編碼
當使用了--enable-extra-encodings設定選項,將額外提供對少量編碼的支持:

歐洲語系 CP{437,737,775,852,853,855,857,858,860,861,863,865,869,1125}
猶太語系 CP864
日語 EUC-JISX0213, Shift_JISX0213, ISO-2022-JP-3
土庫曼語 TDS565
特殊平台 RISCOS-LATIN1

通過將Unicode作為 中間編碼,所有編碼之間都可以相互轉換。
並且也在直譯上提供了有限的支持。就是說,當一個字元在目標的編碼里沒有的對應字元的時候,轉換程式會自動從一個或多個看起來相似的字元中選擇一個。目標編碼名前面加上“//TRANSLIT”即可使用直譯功能。
libiconv在系統缺少多種多樣的字元編碼支持時,提供這樣方面的支持,

使用舉例

使用步驟

(1)打開:iconv_t converter = iconv_open("gbk","utf-8");
(2)轉換:size_trc = iconv(converter, input, insize, output, outsize);
(3)關閉:iconv_close(converter);

函式參數

(iconv_t cd, const char* * inbuf, size_t* inbytesleft, char* * outbuf, size_t * outbytesleft);
需要注意的是iconv 函式會修改指針*inbuf 和指針*outbuf的值(剛開始不知道,老是記憶體泄漏)(*inbytesleft*outbytesleft也會被修改)。因此需要保存原輸入、輸出記憶體分配的地址值。

相關詞條

相關搜尋

熱門詞條

聯絡我們