Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())
2016-02-01 19:58
411 查看
QTextCodec
QTextCodec为文本编码之间提供转换。
Qt用Unicode来存储,绘制和操作字符串。在很多情况下你可能希望操作不同编码的数据。例如,大部分日本文档是以Shift-JIS或ISO2022-JP进行存储,然而俄国用户的文档是以KOI8-R或Windows-1251编码的。
Qt提供一组QtextCodec类来实现非Unicode和Unicode格式之间的转换。你也可以创建自己的编码解码器。
支持的编码如下:
·AppleRoman
·Big5
·Big5-HKSCS
·CP949
·EUC-JP
·EUC-KR
·GB18030-0
·IBM850
·IBM866
·IBM874
·ISO2022-JP
·ISO8859-1to10
·ISO8859-13to16
·Iscii-Bng,Dev,Gjr,Knd,Mlm,Ori,Pnj,Tlg,andTml
·JISX0201
·JISX0208
·KOI8-R
·KOI8-U
·Shift-JIS
·TIS-620
·TSCII
·UTF-8
·UTF-16
·UTF-16BE
·UTF-16LE
·UTF-32
·UTF-32BE
·UTF-32LE
·Windows-1250to1258
如果启用支持Qt与ICU一起编译,ICU支持的大部分编码解码器在程序中也可用。
QTextCodecs可以像下面一样使用吧本地编码转换为Unicode,假设有一个俄文KOI8-R编码的字符串,并想把它转为Unicode。简单的做法是:
QByteArrayencodedString="...";
QTextCodec*codec=QTextCodec::codecForName("KOI8-R");
QStringstring=codec->toUnicode(encodedString);
此后,文本字符串转化为Unicode。把一个Unicode字符串转化为本地编码的字符串也很简单:
为了用不同的编码进行读写,可以用QTextStream及其函数setCodec()。
当试图转换数据块时有些是需要注意的,例如,当从网络接收到数据块,这种情况下多字节的字符可能被分在了两个数据块。这时最好只是导致字符的丢失,最坏可能导致转换失败。
在这种情况下的方法是为解码器创建一个QTextDecoder对象并在整个解码过程用这个QTextDecoder对象。例子如下:
QTextDecoder对象维护了数据块之间的状态,即使多字节的字符被分在不同的数据块也能正常的工作。
纯虚函数将编码描述到系统,而且在QTextStream支持的不同文本文件格式中,在X11特定字符的输入输出都是需要这个编码解码器的。
为了添加新的编码到Qt,继承QTextCodec并重新实现以下函数:
numQTextCodec::ConversionFlag
QTranslator
QTranslator为文本的输出的国际化提供支持。
QTranslator的对象包含一组从源语言到目标语言的译文。QTranslator提供函数在翻译文件中查找译文。翻译文件被QtLinguist.创建的。
QTranslator最常见的用法是:加载一个翻译未见,用QCoreApplication::installTranslator()安装,并通过QObject::tr()使用它。例如:
intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);
QTranslatortranslator;
translator.load("hellotr_la");
app.installTranslator(&translator);
QPushButtonhello(QPushButton::tr("Helloworld!"));
hello.resize(100,30);
hello.show();
returnapp.exec();
}
注意:translator必须在程序的widgets之前创建。
大多数程序不用对该类做其他操作。QTranslator类提供的其他函数对于操作翻译文件的程序是很有用的。
translate()来查找一个译文。translate()接受三个参数:
·context–通常是调用tr()函数的类名
·sourcetext–通常是tr()参数.
·disambiguation–一个可选的字符串消除相同文本在相同上下文的不同用法的歧义。
例如,如果程序运行在波兰语环境,在对话框中的"Cancel"则有可能变为"Anuluj"。
上下文就是对话框类名,这通常没有任何意见而且翻译文本为"Anuluj"。
但不总是那么简单的。设置为双面打印和绑定的西班牙版本的打印对话框可能需要"Activado"和"Activada"翻译为"Enabled".。在这种情况下,源文本在所有情况下都是"Enabled",上下文是对话框类名,但是这两项可能消除歧义,一个是"two-sidedprinting"另外一个则为"binding"。消除歧义使得translator为西班牙版本选择适当的性别,使得Qt能区分译文。
这个机制可以使得特定的译文被选中或优先于别的译文。从程序中卸载translator只需要把它传给QCoreApplication::removeTranslator()函数和用QCoreApplication::installTranslator().重新安装。它将成为第一个被查找匹配字符串的译文。
QLocale
在不同的语言中,Qlocale为数字和它们的字符串提供转换。
Qlocale在构造函数由语言/国家对来初始化,并提供数字到字符串和字符串到数字的转换函数。例如:
QLocaleegyptian(QLocale::Arabic,QLocale::Egypt);
QString s1=egyptian.toString(1.571429E+07,'e');
QString s2=egyptian.toString(10);
doubled=egyptian.toDouble(s1);
inti=egyptian.toInt(s2);
QLocale支持默认的语言环境的概念,它有程序启动的系统设置决定。默认语言环境可以通过静态函数setDefault()来改变。设置默认语言环境有以下影响:
·如果一个QLocale对象有默认构造函数生成,则使用的是默认语言环境设置。
·QString::toInt(),QString::toDouble()等函数根据默认语言环境来翻译字符串。如果失败则退回到“C”环境。
·QString::arg()使用默认语言环境来生成格式化数字,如果格式字符串指示的位置包含’L’,如"%L1"
下面的例子说明了如何直接使用QLocale:
如果在构造函数中指定语言/国家,下面三件事之一可能发生:
·如果在数据库中找到语言/国家,那就用它。
·如果语言能找到,但是国家没找到或国家是其他国家,则语言将和最适当的国家一起使用。
如果语言和国家都没有找到,则QLocale为默认的语言环境。
可以用language()和country()来确定实际使用的语言和国家。
另外一种构造QLocale对象的方法是指定语言环境名称。
构造函数将语言环境名称转为语言/国家。它不只用系统语言环境数据库。
注意:对于当前键盘输入区域,检查一下QInputMethod::locale().。
http://blog.csdn.net/hai200501019/article/details/9202807
QTextCodec为文本编码之间提供转换。
Qt用Unicode来存储,绘制和操作字符串。在很多情况下你可能希望操作不同编码的数据。例如,大部分日本文档是以Shift-JIS或ISO2022-JP进行存储,然而俄国用户的文档是以KOI8-R或Windows-1251编码的。
Qt提供一组QtextCodec类来实现非Unicode和Unicode格式之间的转换。你也可以创建自己的编码解码器。
支持的编码如下:
·AppleRoman
·
·
·CP949
·
·
·
·IBM850
·IBM866
·IBM874
·
·ISO8859-1to10
·ISO8859-13to16
·Iscii-Bng,Dev,Gjr,Knd,Mlm,Ori,Pnj,Tlg,andTml
·JISX0201
·JISX0208
·KOI8-R
·KOI8-U
·
·TIS-620
·
·UTF-8
·UTF-16
·UTF-16BE
·UTF-16LE
·UTF-32
·UTF-32BE
·UTF-32LE
·Windows-1250to1258
如果启用支持Qt与ICU一起编译,ICU支持的大部分编码解码器在程序中也可用。
QTextCodecs可以像下面一样使用吧本地编码转换为Unicode,假设有一个俄文KOI8-R编码的字符串,并想把它转为Unicode。简单的做法是:
QTextCodec*codec=QTextCodec::
此后,文本字符串转化为Unicode。把一个Unicode字符串转化为本地编码的字符串也很简单:
QStringstring="...";
QTextCodec*codec=QTextCodec::codecForName("KOI8-R");
QByteArrayencodedString=codec-> fromUnicode(string);
为了用不同的编码进行读写,可以用
当试图转换数据块时有些是需要注意的,例如,当从网络接收到数据块,这种情况下多字节的字符可能被分在了两个数据块。这时最好只是导致字符的丢失,最坏可能导致转换失败。
在这种情况下的方法是为解码器创建一个
QTextCodec*codec=QTextCodec::codecForName("Shift-JIS");
QTextDecoder*decoder=codec-> makeDecoder();
QStringstring;
while(new_data_available()){
QByteArraychunk=get_new_data();
string+=decoder->toUnicode(chunk);
}
deletedecoder;
CreatingYourOwnCodecClass
Qt支持通过创建QTextCodec子类添加新的文本编码。纯虚函数将编码描述到系统,而且在
为了添加新的编码到Qt,继承QTextCodec并重新实现以下函数:
Function | Description |
Returnstheofficialnamefortheencoding.Iftheencodingislistedinthe | |
Returnsalistofalternativenamesfortheencoding.QTextCodecprovidesadefaultimplementationthatreturnsanemptylist.Forexample,"ISO-8859-1"has"latin1","CP819","IBM819",and"iso-ir-100"asaliases. | |
ReturntheMIBenumfortheencodingifitislistedinthe | |
Convertsan8-bitcharacterstringtoUnicode. | |
ConvertsaUnicodestringtoan8-bitcharacterstring. |
MemberTypeDocumentation
numQTextCodec::ConversionFlag
flagsQTextCodec::ConversionFlags
Constant | Value | Description |
QTextCodec::DefaultConversion | 0 | Noflagisset. |
QTextCodec::ConvertInvalidToNull | 0x80000000 | Ifthisflagisset,eachinvalidinputcharacterisoutputasanullcharacter. |
QTextCodec::IgnoreHeader | 0x1 | IgnoreanyUnicodebyte-ordermarkanddon'tgenerateany. |
QTranslator为文本的输出的国际化提供支持。
QTranslator的对象包含一组从源语言到目标语言的译文。QTranslator提供函数在翻译文件中查找译文。翻译文件被
QTranslator最常见的用法是:加载一个翻译未见,用
intmain(intargc,char*argv[])
{
QTranslatortranslator;
translator.load("hellotr_la");
app.installTranslator(&translator);
hello.resize(100,30);
hello.show();
returnapp.exec();
}
注意:translator必须在程序的widgets之前创建。
大多数程序不用对该类做其他操作。QTranslator类提供的其他函数对于操作翻译文件的程序是很有用的。
LookingupTranslations
你可以通过·context–通常是调用tr()函数的类名
·sourcetext–通常是
·disambiguation–一个可选的字符串消除相同文本在相同上下文的不同用法的歧义。
例如,如果程序运行在波兰语环境,在对话框中的"Cancel"则有可能变为"Anuluj"。
上下文就是对话框类名,这通常没有任何意见而且翻译文本为"Anuluj"。
但不总是那么简单的。设置为双面打印和绑定的西班牙版本的打印对话框可能需要"Activado"和"Activada"翻译为"Enabled".。在这种情况下,源文本在所有情况下都是"Enabled",上下文是对话框类名,但是这两项可能消除歧义,一个是"two-sidedprinting"另外一个则为"binding"。消除歧义使得translator为西班牙版本选择适当的性别,使得Qt能区分译文。
UsingMultipleTranslations
在一个程序中可以使用多个翻译文件,译文的查找与安装的顺序相反,所以进行翻译时最近安装的翻译文件最先被查找,最早安装的翻译文件最后被查找。一旦找到译文中包含匹配的字符串就停止查找。这个机制可以使得特定的译文被选中或优先于别的译文。从程序中卸载translator只需要把它传给
QLocale
在不同的语言中,Qlocale为数字和它们的字符串提供转换。
Qlocale在构造函数由语言/国家对来初始化,并提供数字到字符串和字符串到数字的转换函数。例如:
QLocaleegyptian(QLocale::Arabic,QLocale::Egypt);
doubled=egyptian.
inti=egyptian.
QLocale支持默认的语言环境的概念,它有程序启动的系统设置决定。默认语言环境可以通过静态函数
·如果一个QLocale对象有默认构造函数生成,则使用的是默认语言环境设置。
·
·
下面的例子说明了如何直接使用QLocale:
QLocale::setDefault(QLocale(QLocale::Hebrew,QLocale::Israel));
QLocalehebrew;//ConstructsadefaultQLocale
QString s1=hebrew.toString(15714.3,'e');
boolok;
doubled;
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=="1234512,3453039"
如果在构造函数中指定语言/国家,下面三件事之一可能发生:
·如果在数据库中找到语言/国家,那就用它。
·如果语言能找到,但是国家没找到或国家是其他国家,则语言将和最适当的国家一起使用。
如果语言和国家都没有找到,则QLocale为默认的语言环境。
可以用
另外一种构造QLocale对象的方法是指定语言环境名称。
QLocalekorean("ko");
QLocaleswiss("de_CH");
构造函数将语言环境名称转为语言/国家。它不只用系统语言环境数据库。
注意:对于当前键盘输入区域,检查一下
相关文章推荐
- Qt属性系统
- Qt容器类(总结)
- Qt状态机框架
- Qt新建线程的方法(有QRunnable,QThreadPool,moveToThread和QtConcurrent的例子)
- QtSoap调用Web Service(QtSoap是非官方应用)
- QTableWidget 导出到csv表格
- 文本导出到pdf文件(使用QPrinter和QPainter和QTextDocument)
- PyQt5 笔记(05):信号/槽
- QTableWidget排序问题
- Qt实现不同Treewidget之间拖拽
- Qt实现QQ好友下拉列表(用QListView实现,所以还得定义它的Model)
- Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)
- QTabWidget 实现类似QQ聊天窗口(拖动分离出新的窗口)
- Qt 状态机框架学习(没学会)
- Qt 智能指针学习(7种QT智能指针和4种std智能指针)
- qt 使用xlslib操作execl
- 使用Qt库时出现winsock2.h和windos.h包含顺序错误
- PyQt5 笔记(04):主窗口卡死问题
- Ogre3D嵌入Qt框架 之 小结
- 分享一个自己写的QT小游戏-玛丽奥医生