Qt國際化相關類(以前沒見過codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())


QTextCodec

QTextCodec為文本編碼之間提供轉換。

Qt用Unicode 來存儲,繪制和操作字符串。在很多情況下你可能希望操作不同編碼的數據。例如,大部分日本文檔是以Shift-JIS或 ISO 2022-JP進行存儲,然而俄國用戶的文檔是以KOI8-R 或 Windows-1251編碼的。

Qt提供一組QtextCodec類來實現非Unicode 和Unicode 格式之間的轉換。你也可以創建自己的編碼解碼器。

支持的編碼如下:

·        Apple Roman

·        Big5

·        Big5-HKSCS

·        CP949

·        EUC-JP

·        EUC-KR

·        GB18030-0

·        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

·        JIS X 0201

·        JIS X 0208

·        KOI8-R

·        KOI8-U

·        Shift-JIS

·        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");

QString string = codec->toUnicode(encodedString);

此后,文本字符串轉化為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.

convertToUnicode()

Converts an 8-bit character string to Unicode.

convertFromUnicode()

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM