QTextCodec
QTextCodec为文本编码之间提供转换。
Qt用Unicode 来存储,绘制和操作字符串。在很多情况下你可能希望操作不同编码的数据。例如,大部分日本文档是以Shift-JIS或 ISO 2022-JP进行存储,然而俄国用户的文档是以KOI8-R 或 Windows-1251编码的。
Qt提供一组QtextCodec类来实现非Unicode 和Unicode 格式之间的转换。你也可以创建自己的编码解码器。
支持的编码如下:
· Apple Roman
· Big5
· CP949
· EUC-JP
· EUC-KR
· IBM 850
· IBM 866
· IBM 874
· 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
· 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");
此后,文本字符串转化为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. |
Converts an 8-bit character string to Unicode. |
|
Converts a Unicode string to an 8-bit character string. |
Member Type Documentation
numQTextCodec::ConversionFlag
flags QTextCodec::ConversionFlags
Constant |
Value |
Description |
QTextCodec::DefaultConversion |
|
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(,);
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+,'e');
QString s2 = egyptian.toString();
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().arg().arg(,,);
// str == "12345 12,345 3039"
如果在构造函数中指定语言/国家,下面三件事之一可能发生:
· 如果在数据库中找到语言/国家,那就用它。
· 如果语言能找到,但是国家没找到或国家是其他国家,则语言将和最适当的国家一起使用。
如果语言和国家都没有找到,则QLocale 为默认的语言环境。
可以用 language() 和 country() 来确定实际使用的语言和国家。
另外一种构造QLocale 对象的方法是指定语言环境名称。
QLocale korean("ko");
QLocale swiss("de_CH");
构造函数将语言环境名称转为语言/国家。它不只用系统语言环境数据库。
注意:对于当前键盘输入区域,检查一下QInputMethod::locale().。
Qt国际化相关类的更多相关文章
-
Qt国际化相关类(以前没见过codec->;toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())
QTextCodec QTextCodec为文本编码之间提供转换. Qt用Unicode 来存储,绘制和操作字符串.在很多情况下你可能希望操作不同编码的数据.例如,大部分日本文档是以Shift-JIS ...
-
Qt 学习之路 2(73):Qt 线程相关类
Home / Qt 学习之路 2 / Qt 学习之路 2(73):Qt 线程相关类 Qt 学习之路 2(73):Qt 线程相关类 豆子 2013年11月26日 Qt 学习之路 2 7条评论 希 ...
-
Qt 学习之路 :Qt 线程相关类
希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必 ...
-
QT国际化 一 (lupdate/linguits/lrelease)
QT国际化(lupdate/linguits/lrelease) 本文由乌合之众瞎写http://www.cnblogs.com/oloroso/ qt国际化其实就是qt中字符串的字符集编码的设置.当 ...
-
Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门
说明: Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代 ...
-
Qt国际化详细介绍,中文乱码以及解决方案
Qt国际化的一般步骤 运行 lupdate,从应用程序的代码中提取所有界面上的可见字符. 这些可见字符必须被 tr() .QCoreApplication::translate().Qt ...
-
QT国际化(中英转换)
转载:https://blog.csdn.net/u012528526/article/details/54707233 QT国际化(中英转换) 我们都知道在安卓中,想做国际化很简单,只需要建立对应的 ...
-
用 Qt 的 QAudioOutput 类播放 WAV 音频文件
用 Qt 的 QAudioOutput 类播放 WAV 音频文件 最近有一个项目,需要同时控制 4 个声卡播放不同的声音,声音文件很简单就是没有任何压缩的 wav 文件. 如果只是播放 wav 文件, ...
-
PHP中的国际化日历类
在 PHP 的国际化组件中,还有一个我们并不是很常用的跟日期相关的操作类,它就是日历操作类.说是日历,其实大部分还是对日期时间的操作,一般也是主要用于日期的格式化和比较之类的.但是通常我们直接使用 d ...
随机推荐
-
dll版本冲突的解决方法
问题描述 当运行站点或者控制台等程序时,如果项目引用的dll版本与其它dll所依赖的dll版本不一致,就会报未能加载程序集的错误.错误信息为: 未能加载文件或程序集"Newtonsoft.J ...
-
C#通过反射进行枚举描述相关操作
C#可以通过反射,来获取枚举的描述信息或通过描述信息获取到指定类型的枚举 /// <summary> /// 获取枚举描述 /// </summary> /// <par ...
-
Codeforces Round #263 (Div. 2)
吐槽:一辈子要在DIV 2混了. A,B,C都是简单题,看AC人数就知道了. A:如果我们定义数组为N*N的话就不用考虑边界了 #include<iostream> #include &l ...
-
武汉科技大学ACM:1002: 华科版C语言程序设计教程(第二版)例题6.6
Problem Description 明天就要英语考试了,小明明正在挑灯夜 战背单词.小明明发现单词很难背,背一个忘一个.经过仔细研究,小明明发现单词难背的原因是因为某个字符的出现,破坏了整个单词的 ...
-
CCTF-PWN1&;&;PWN3
CCTF-PWN1&&PWN3 PWN1比较有意思,在得到输入的数据后使用shutdown将标准输入,标准输出和标准错误关闭了读写功能的读.也就是不能进行交互了,要保证一次输入就能拿到 ...
-
全球多个 TOP 网站藏挖矿代码,5 亿 PC 沦为矿工
据ZDNet报道,现在很多网站都开始在网页脚本中藏匿挖矿代码,在用户访问时偷算力用于挖矿.来自Adguard的报告称也证实,也有5亿台电脑中招. 最新最热的IT技术付费社区 IT帮 itbang.me ...
-
Python 数据科学系列 の Numpy、Series 和 DataFrame介绍
本課主題 Numpy 的介绍和操作实战 Series 的介绍和操作实战 DataFrame 的介绍和操作实战 Numpy 的介绍和操作实战 numpy 是 Python 在数据计算领域里很常用的模块 ...
-
Java随感
创新项目要用java,而我只大概会C++,只能靠自学咯~~~随时将一些重要的概念做笔记在这里吧>_< 1.一个源文件中只能有一个public类,一个源文件可以有多个非public类 2.所 ...
-
前端es6基础语法
1.let.const.var var是声明全局的变量,作用域是全局,const是声明全局的常量,不能修改,而let是块级变量只在当前声明的作用域中生效: { var a = 10; let b = ...
-
Apache Shiro 用户信息保存在session方案
描述 在使用shiro的时候,经常会有一种需求: 把登录成功后的用户对象存放到session中,方面其他地方调用.存放到session这个步骤到底应该在哪里去做,有几个地方比较合适: 调用 Subje ...