您的位置:首页 > 编程语言 > Qt开发

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字符串转化为本地编码的字符串也很简单:

QStringstring="...";

QTextCodec*codec=QTextCodec::codecForName("KOI8-R");

QByteArrayencodedString=codec->fromUnicode(string);


为了用不同的编码进行读写,可以用QTextStream及其函数setCodec()。

当试图转换数据块时有些是需要注意的,例如,当从网络接收到数据块,这种情况下多字节的字符可能被分在了两个数据块。这时最好只是导致字符的丢失,最坏可能导致转换失败。

在这种情况下的方法是为解码器创建一个QTextDecoder对象并在整个解码过程用这个QTextDecoder对象。例子如下:

QTextCodec*codec=QTextCodec::codecForName("Shift-JIS");

QTextDecoder*decoder=codec->makeDecoder();


QStringstring;

while(new_data_available()){

QByteArraychunk=get_new_data();

string+=decoder->toUnicode(chunk);

}

deletedecoder;


QTextDecoder对象维护了数据块之间的状态,即使多字节的字符被分在不同的数据块也能正常的工作。

CreatingYourOwnCodecClass

Qt支持通过创建QTextCodec子类添加新的文本编码。

纯虚函数将编码描述到系统,而且在QTextStream支持的不同文本文件格式中,在X11特定字符的输入输出都是需要这个编码解码器的。

为了添加新的编码到Qt,继承QTextCodec并重新实现以下函数:

Function

Description

name()

Returnstheofficialnamefortheencoding.IftheencodingislistedintheIANAcharacter-setsencodingfile,thenameshouldbethepreferredMIMEnamefortheencoding.

aliases()

Returnsalistofalternativenamesfortheencoding.QTextCodecprovidesadefaultimplementationthatreturnsanemptylist.Forexample,"ISO-8859-1"has"latin1","CP819","IBM819",and"iso-ir-100"asaliases.

mibEnum()

ReturntheMIBenumfortheencodingifitislistedintheIANAcharacter-setsencodingfile.

convertToUnicode()

Convertsan8-bitcharacterstringtoUnicode.

convertFromUnicode()

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提供函数在翻译文件中查找译文。翻译文件被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类提供的其他函数对于操作翻译文件的程序是很有用的。

LookingupTranslations

你可以通过translate()来查找一个译文。translate()接受三个参数:

·context–通常是调用tr()函数的类名

·sourcetext–通常是tr()参数.

·disambiguation–一个可选的字符串消除相同文本在相同上下文的不同用法的歧义。

例如,如果程序运行在波兰语环境,在对话框中的"Cancel"则有可能变为"Anuluj"。

上下文就是对话框类名,这通常没有任何意见而且翻译文本为"Anuluj"。

但不总是那么简单的。设置为双面打印和绑定的西班牙版本的打印对话框可能需要"Activado"和"Activada"翻译为"Enabled".。在这种情况下,源文本在所有情况下都是"Enabled",上下文是对话框类名,但是这两项可能消除歧义,一个是"two-sidedprinting"另外一个则为"binding"。消除歧义使得translator为西班牙版本选择适当的性别,使得Qt能区分译文。

UsingMultipleTranslations

在一个程序中可以使用多个翻译文件,译文的查找与安装的顺序相反,所以进行翻译时最近安装的翻译文件最先被查找,最早安装的翻译文件最后被查找。一旦找到译文中包含匹配的字符串就停止查找。

这个机制可以使得特定的译文被选中或优先于别的译文。从程序中卸载translator只需要把它传给QCoreApplication::removeTranslator()函数和用QCoreApplication::installTranslator().重新安装。它将成为第一个被查找匹配字符串的译文。

QLocale

在不同的语言中,Qlocale为数字和它们的字符串提供转换。

Qlocale在构造函数由语言/国家对来初始化,并提供数字到字符串和字符串到数字的转换函数。例如:

QLocaleegyptian(QLocale::Arabic,QLocale::Egypt);

QStrings1=egyptian.toString(1.571429E+07,'e');

QStrings2=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::setDefault(QLocale(QLocale::Hebrew,QLocale::Israel));

QLocalehebrew;//ConstructsadefaultQLocale

QStrings1=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为默认的语言环境。

可以用language()和country()来确定实际使用的语言和国家。

另外一种构造QLocale对象的方法是指定语言环境名称。

QLocalekorean("ko");

QLocaleswiss("de_CH");


构造函数将语言环境名称转为语言/国家。它不只用系统语言环境数据库。

注意:对于当前键盘输入区域,检查一下QInputMethod::locale().。
http://blog.csdn.net/hai200501019/article/details/9202807
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: