• 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

  • 相关阅读:
    Windows 中 SQLite3 使用(1) -- 配置
    vs中qt的QIcon图标图片加载不上的问题
    VS中QT资源文件qrc加载失败(Q_INIT_RESOURCE)qInitResources_出错
    c++前置声明的一点总结
    Windows 如何在cmd命令行中查看、修改、删除与添加环境变量
    在DLL对话框中截获鼠标按下的消息
    c++跨动态库DLL的内存分配与释放问题
    C++中placement new操作符(经典)
    起底多线程同步锁(iOS)
    AutoLayout框架Masonry使用心得
  • 原文地址:https://www.cnblogs.com/findumars/p/5176184.html
Copyright © 2020-2023  润新知