原標題:QTextCodec 類 - 編/解碼小工具

本節的結構圖如下,文字版移步這裏:

概述

在 Qt 眼中只有兩種編碼:Unicode 和非 Unicode。Qt 自己內部都統一使用 Unicode 編碼。要把非 Unicode 編碼轉換成 Qt 自己使用的 Unicode 編碼,只需要設置下 QTextCodec 類採用什麼非 Unicode 編碼,然後一條函數代碼即可搞定。

最常用的用法示例

我從來沒見過比 QTextCodec 類更便捷的進行字符編碼轉換的類了。我們以俄語爲例,想把一段俄文 KOI8-R 編碼的字符串和 Unicode 編碼的字符串相互轉化,用區區幾行代碼就可以:

俄文 KOI8-R -> Unicode

Unicode -> 俄文 KOI8-R

有人問了,我想在俄文和中文之間進行轉換,咋辦?我就想說是不是傻?俄文 -> Unicode -> 中文不就可以了麼。

支持的編碼格式

Big5、Big5-HKSCS、CP949、EUC-JP、EUC-KR、GB18030、HP-ROMAN8、IBM 850、IBM 866、IBM 874、ISO 2022-JP、ISO 8859-1 to 10、ISO 8859-13 to 16、Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, and Tml、KOI8-R、KOI8-U、Macintosh、Shift-JIS、TIS-620、TSCII、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE、Windows-1250 to 1258。

如何按照某種編碼格式讀寫文件?

因爲上面我們舉的例子適合一段短小的文本,如果想以某種編碼格式讀寫文件,此時可以使用 QTextStream 和 setCodec() 函數。參考官方示例:Codecs。

網絡傳輸中的編碼問題

網絡傳輸的數據都是 0101010101,那我們怎麼知道到了哪一個數據段就是一個字呢?而且如果出現分包的情況下,如果數據收的不完整而直接用 QTextCodec 轉換可能會失敗。爲了解決這個問題,我們需要爲 QTextCodec 創建一個 QTextDecoder 對象,使用這個對象來完成整個轉碼過程。因爲 QTextDecoder 這個類會維護“數據塊”之間的狀態,即使一段完整的數據被拆分開也可以正常把它們拼接起來。示例代碼如下:

如何自定義編碼類?

因爲這部分用的實在太少太少了,這裏只說下如何做。首先肯定是要子類化 QTextCodec,然後實現如下的幾個函數:

返回編碼的名稱。如果你要自定義的編碼在 IANA 字符集中有,那就返回其中的 MIME 名稱。

返回編碼的別名。一個編碼如果沒有別名,那這個函數默認返回空。編碼別名的例子有“ISO-8859-1”也叫“latin1”。

返回編碼的 MIB 枚舉。

將 8-bit 字符轉換成 Unicode。

將 Unicode 轉換爲 8-bit 字符。

availableCodecs() 可用的編/解碼Mib:QList

availableMibs() 設置本地編/解碼:void setCodecForLocale(QTextCodec *c) 獲取 QTextCodec[static] 適合某名稱:QTextCodec * codecForName(......) 適合本地 Locale:QTextCodec * codecForLocale() 適合 BOM:QTextCodec * codecForUtfText(......) 適合 HTML:QTextCodec * codecForHtml(......) 適合 Mib:QTextCodec * codecForMib(int mib) 轉碼 Unicode->非Unicode:QByteArray fromUnicode(......) const 非Unicode->Unicode:QString toUnicode(......) const 網絡傳輸 創建 QTextDecoder:QTextDecoder * makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const 創建 QTextEncoder:QTextDecoder * makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const 其他 轉碼設置:enum ConversionFlag { DefaultConversion, ConvertInvalidToNull, IgnoreHeader } 判斷是否可以轉碼:bool canEncode(......) const

查看原文 >>
相關文章