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

时间: 2024-10-05 16:12:21

Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())的相关文章

Qt 学习之路 :Qt 线程相关类

希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必要再三强调使用线程一定要万分小心,一不留神就会陷入陷阱. 事实上,Qt 对线程的支持可以追溯到2000年9月22日发布的 Qt 2.2.在这个版本中,Qt 引入了QThread.不过,当时对线程的支持并不是默认开启的.Qt 4.0 开始,线程成为所有平台的默认开启选项(这意味着如果不需要线程,你可以

Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Qt的国际化. QTextCodec QTextDecoder QTextEncoder QTranslator QLocale Languages and WritingSystems 有时,国际化是比较简单的,例如,把美国的应用程序让澳大利亚或英国的用户可访问,只需要简单的改变拼写.但是,把美国的

用 Qt 的 QAudioOutput 类播放 WAV 音频文件

用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件,那么 Qt 里简单的 QSound 类是最适合的.但是 QSound 有一个很大的缺陷就是无法选择用哪个声卡.一番研究之后,决定用 QAudioOutput 来播放 WAV 音频文件. 网上也能找到几篇相关的文章,比如: http://blog.csdn.net/qyee16/article/det

用 Qt 的 QAudioOutput 类播放 WAV 音频文件(使用了libsndfile外部库)

用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件,那么 Qt 里简单的 QSound 类是最适合的.但是 QSound 有一个很大的缺陷就是无法选择用哪个声卡.一番研究之后,决定用 QAudioOutput 来播放 WAV 音频文件. 网上也能找到几篇相关的文章,比如: http://blog.csdn.net/qyee16/article/det

RecipientEditTextView相关类

概述 RecipientEditTextView是Android原生短信和电子邮件中用到的控件,代码位于frameworks/opt/chips(mtk代码中有对其修改,位于frameworks/ex/chips),会编译成libchips的jar包,app在编译时把它作为静态库编译. 如图所示,其中有"+10"字样的所在行就是RecipientEditTextView控件.每个号码有对应联系人的话会显示相应头像和名称,图像为一个圆角矩形,代码中对应的数据机构为一个chip.10表示已

【Anroid】第9章 列表视图(1)--ListView相关类及其适配器

分类:C#.Android.VS2015: 创建日期:2016-02-18 一.简介 列表视图(ListView)是Android应用程序中使用最频繁的UI组件,从无处不在短菜单选项列表到冗长的联系人或internet收藏夹列表--都会用它来实现. ListView控件的用法非常灵活,既可以使用内置的视图呈现基本的样式,也可以用自定义视图呈现各种特殊的视觉效果. 要完全掌握Android提供的ListView控件的用法,需要解决下面的问题: (1)如何用Android内置的视图呈现列表视图中的每

你没见过吧?16款形态各异的加载进度条设计

互联网连接越来越快,但难免有一些时刻需要我们等待.在这种情况下,创意的设计师尽力减轻用户等待的痛苦,苦思敏想设计各种创意的进度条(或加载条)效果 ,让用户等待的过程变得更加愉悦. 您可能感兴趣的相关文章 22套 Web & Mobile PSD 用户界面素材 45套精美的手机界面设计素材和设计工具 分享30套精美的Web和手机开发UI素材 60个精美的免费移动开发PSD素材资源 45套新鲜出炉的精美 PSD 网页设计素材 Loading by pearlsomani Flat Loading B

Web---演示Servlet的相关类、下载技术、线程问题、自定义404页面

Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. HttpSession – 代表用户的一次会话. 本篇博客演示:ServletConfig类 和 ServletContext 类(网页点击量统计,留言板和图片下载技术(其他类型文件类似)) ServletConfig: 它包含了Serv

ajax相关类web前端面试题

ajax相关类 1. ajax的跨域问题和缓存原理? 答: 推荐:ajax处理跨域有几种方式?实现原理是什么? 推荐:ajax缓存原理 2. 同步与异步的区别? 答: 1. 同步请求:顺序处理,即当我们向服务器发出一个请求时,在服务器没返回结果给客户端之前,我们要一直处于等待状态直至服务器将结果返回到客户端,我们才能执行下一步操作. 2. 异步请求:并行处理,当我们向服务器发出一个请求时,在服务器没返回结果之前,我们还是可以执行其他操作. 3. ajax属于javascript? 答:javas