QTextCodec
Qt用Unicode 來存儲,繪制和操作字符串。在很多情況下你可能希望操作不同編碼的數據。例如,大部分日本文檔是以Shift-JIS或 ISO 2022-JP進行存儲,然而俄國用戶的文檔是以KOI8-R 或 Windows-1251編碼的。
Qt提供一組QtextCodec類來實現非Unicode 和Unicode 格式之間的轉換。你也可以創建自己的編碼解碼器。
支持的編碼如下:
· Apple Roman
· Big5
· CP949
· EUC-JP
· EUC-KR
· IBM 850
· IBM 866
· IBM 874
· ISO 8859-1 to 10
· ISO 8859-13 to 16
· Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori,Pnj, Tlg, and Tml
· JIS X 0201
· JIS X 0208
· KOI8-R
· KOI8-U
· TIS-620
· TSCII
· UTF-8
· UTF-16
· UTF-16BE
· UTF-16LE
· UTF-32
· UTF-32BE
· UTF-32LE
· Windows-1250 to 1258
如果啟用支持Qt與ICU一起編譯,ICU支持的大部分編碼解碼器在程序中也可用。
QTextCodecs 可以像下面一樣使用吧本地編碼轉換為Unicode,假設有一個俄文 KOI8-R編碼的字符串,並想把它轉為Unicode。簡單的做法是:
QByteArray encodedString ="...";
QTextCodec*codec=QTextCodec::codecForName("KOI8-R");
此后,文本字符串轉化為Unicode。把一個Unicode字符串轉化為本地編碼的字符串也很簡單:
QString string ="...";
QTextCodec*codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedString = codec->fromUnicode(string);
為了用不同的編碼進行讀寫,可以用 QTextStream 及其函數 setCodec() 。
當試圖轉換數據塊時有些是需要注意的,例如,當從網絡接收到數據塊,這種情況下多字節的字符可能被分在了兩個數據塊。這時最好只是導致字符的丟失,最壞可能導致轉換失敗。
在這種情況下的方法是為解碼器創建一個 QTextDecoder對象並在整個解碼過程用這個 QTextDecoder對象。例子如下:
QTextCodec*codec = QTextCodec::codecForName("Shift-JIS");
QTextDecoder*decoder = codec->makeDecoder();
QString string;
while (new_data_available()) {
QByteArray chunk = get_new_data();
string += decoder->toUnicode(chunk);
}
delete decoder;
QTextDecoder 對象維護了數據塊之間的狀態,即使多字節的字符被分在不同的數據塊也能正常的工作。
CreatingYour Own Codec Class
Qt支持通過創建QTextCodec 子類添加新的文本編碼。
純虛函數將編碼描述到系統,而且在QTextStream支持的不同文本文件格式中,在X11特定字符的輸入輸出都是需要這個編碼解碼器的。
為了添加新的編碼到Qt,繼承 QTextCodec 並重新實現以下函數:
Function |
Description |
name() |
Returns the official name for the encoding. If the encoding is listed in the IANA character-sets encoding file, the name should be the preferred MIME name for the encoding. |
aliases() |
Returns a list of alternative names for the encoding. QTextCodec provides a default implementation that returns an empty list. For example, "ISO-8859-1" has "latin1", "CP819", "IBM819", and "iso-ir-100" as aliases. |
mibEnum() |
Return the MIB enum for the encoding if it is listed in the IANA character-sets encoding file. |
Converts an 8-bit character string to Unicode. |
|
Converts a Unicode string to an 8-bit character string. |
Member Type Documentation
numQTextCodec::ConversionFlag
flags QTextCodec::ConversionFlags
Constant |
Value |
Description |
QTextCodec::DefaultConversion |
0 |
No flag is set. |
QTextCodec::ConvertInvalidToNull |
0x80000000 |
If this flag is set, each invalid input character is output as a null character. |
QTextCodec::IgnoreHeader |
0x1 |
Ignore any Unicode byte-order mark and don't generate any. |
QTranslator
QTranslator 為文本的輸出的國際化提供支持。
QTranslator 的對象包含一組從源語言到目標語言的譯文。QTranslator 提供函數在翻譯文件中查找譯文。翻譯文件被Qt Linguist.創建的。
QTranslator 最常見的用法是:加載一個翻譯未見,用QCoreApplication::installTranslator()安裝,並通過QObject::tr()使用它。例如:
int main(intargc,char*argv[])
{
QApplication app(argc, argv);
QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
QPushButton hello(QPushButton::tr("Hello world!"));
hello.resize(100,30);
hello.show();
return app.exec();
}
注意:translator 必須在程序的widgets之前創建。
大多數程序不用對該類做其他操作。QTranslator 類提供的其他函數對於操作翻譯文件的程序是很有用的。
Lookingup Translations
你可以通過 translate()來查找一個譯文。 translate() 接受三個參數:
· context –通常是調用tr()函數的類名
· source text –通常是 tr()參數.
· disambiguation – 一個可選的字符串消除相同文本在相同上下文的不同用法的歧義。
例如,如果程序運行在波蘭語環境,在對話框中的 "Cancel" 則有可能變為 "Anuluj"。
上下文就是對話框類名,這通常沒有任何意見而且翻譯文本為"Anuluj"。
但不總是那么簡單的。設置為雙面打印和綁定的西班牙版本的打印對話框可能需要"Activado" 和 "Activada" 翻譯為"Enabled". 。在這種情況下,源文本在所有情況下都是 "Enabled" ,上下文是對話框類名,但是這兩項可能消除歧義,一個 是"two-sided printing" 另外一個則為 "binding" 。消除歧義使得translator 為西班牙版本選擇適當的性別,使得Qt能區分譯文。
UsingMultiple Translations
在一個程序中可以使用多個翻譯文件,譯文的查找與安裝的順序相反,所以進行翻譯時最近安裝的翻譯文件最先被查找,最早安裝的翻譯文件最后被查找。一旦找到譯文中包含匹配的字符串就停止查找。
這個機制可以使得特定的譯文被選中或優先於別的譯文。從程序中卸載translator 只需要把它傳給QCoreApplication::removeTranslator() 函數和用QCoreApplication::installTranslator().重新安裝。它將成為第一個被查找匹配字符串的譯文。
QLocale
在不同的語言中,Qlocale為數字和它們的字符串提供轉換。
Qlocale在構造函數由語言/國家對來初始化,並提供數字到字符串和字符串到數字的轉換函數。例如:
QLocale egyptian(QLocale::Arabic,QLocale::Egypt);
QString s1 = egyptian.toString(1.571429E+07,'e');
QString s2 = egyptian.toString(10);
double d =egyptian.toDouble(s1);
int i =egyptian.toInt(s2);
QLocale 支持默認的語言環境的概念,它有程序啟動的系統設置決定。默認語言環境可以通過靜態函數setDefault()來改變。設置默認語言環境有以下影響:
· 如果一個QLocale 對象有默認構造函數生成,則使用的是默認語言環境設置。
· QString::toInt(), QString::toDouble()等函數根據默認語言環境來翻譯字符串。如果失敗則退回到“C”環境。
· QString::arg()使用默認語言環境來生成格式化數字,如果格式字符串指示的位置包含’L’,如"%L1"
下面的例子說明了如何直接使用QLocale :
QLocale::setDefault(QLocale(QLocale::Hebrew, QLocale::Israel));
QLocale hebrew; // Constructs a default QLocale
QString s1 = hebrew.toString(15714.3,'e');
bool ok;
double d;
QLocale::setDefault(QLocale::C);
d = QString("1234,56").toDouble(&ok); // ok == false
d = QString("1234.56").toDouble(&ok); // ok == true, d == 1234.56
QLocale::setDefault(QLocale::German);
d = QString("1234,56").toDouble(&ok); // ok == true, d == 1234.56
d = QString("1234.56").toDouble(&ok); // ok == true, d == 1234.56
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
str = QString("%1 %L2 %L3")
.arg(12345).arg(12345).arg(12345,0,16);
// str == "12345 12,345 3039"
如果在構造函數中指定語言/國家,下面三件事之一可能發生:
· 如果在數據庫中找到語言/國家,那就用它。
· 如果語言能找到,但是國家沒找到或國家是其他國家,則語言將和最適當的國家一起使用。
如果語言和國家都沒有找到,則QLocale 為默認的語言環境。
可以用 language() 和 country() 來確定實際使用的語言和國家。
另外一種構造QLocale 對象的方法是指定語言環境名稱。
QLocale korean("ko");
QLocale swiss("de_CH");
構造函數將語言環境名稱轉為語言/國家。它不只用系統語言環境數據庫。
注意:對於當前鍵盤輸入區域,檢查一下QInputMethod::locale().。
http://blog.csdn.net/hai200501019/article/details/9202807