Qt4.8文档翻译:QTextCodec类参考,QTextCodec Class Reference
QTextCodec类可用来进行不同字符编码之间的转换。
Qt使用统一码(Unicode)来储存、绘制及处理字符串。经常会出现一些需要处理由不同字符编码表示的数据的情况。
Qt提供了一系列的QTextCodec 类,用于在非统一码和统一码之间作转换。妳还可以创建自己的编解码器类。
目前支持的编码包括:
•.•.Apple Roman
•.•.Big5
•.•.Big5-HKSCS
•.•.CP949
•.•.EUC-JP
•.•.EUC-KR
•.•.GB18030-0
•.•.IBM 850
•.•.IBM 866
•.•.IBM 874
•.•.ISO 2022-JP
•.•.ISO 8859-1 至 10
•.•.ISO 8859-13 至 16
•.•.Iscii-Bng, Dev, Gjr, Knd, Mlm, Ori, Pnj, Tlg, 和 Tml
•.•.JIS X 0201
•.•.JIS X 0208
•.•.KOI8-R
•.•.KOI8-U
•.•.MuleLao-1
•.•.ROMAN8
•.•.Shift-JIS
•.•.TIS-620
•.•.TSCII
•.•.UTF-8
•.•.UTF-16
•.•.UTF-16BE
•.•.UTF-16LE
•.•.UTF-32
•.•.UTF-32BE
•.•.UTF-32LE
•.•.Windows-1250 至 1258
•.•.WINSAMI2
可按以下示例来使用QTextCodecs,将某种本地编码转换成统一码。假设妳的字符串原来是按照老毛子的KOI8-R 编码的,现在想把它转换成统一码。最简单的做法是这样的:
QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
然后,string中的文字就是以统一码格式保存的了。要将统一码编码的字符串转换成本地编码的话,也狠简单:
QString string = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedString = codec->fromUnicode(string);
要想对文件按各种编码进行读写的话,就使用QTextStream和它的setCodec()函数。参考编解码器示例,它演示了如何使用QTextCodec 来进行文件读写。
如果要把数据一块块地转换的话,就要格外小心,例如,通过网络接收数据时就是这种情况。在这种情况下,可能会有多字节字符被切割到两个数据块中。在最好的情况下,将会丢失一个字符,而最坏的情况下呢,整个转换过程将会失败。
在这种情况下,应当创建对应的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对象会维护数据块之间的状态,因此对于一个多字节字符被分割到两个数据块中去的情况也能正确处理。
可通过创建QTextCodec 子类的方法来使得Qt 支持新的字符编码。
那些纯虚函数被用于将这个新的编解码器引入到系统中,它将被按照预定的方法用于以下场景:为QTextStream提供对不同文本格式的支持;在X11 中,用于输入/输出与区域语言相关的字符。
要想让Qt 支持某种字符编码,就编写一个QTextCodec 子类,实现以下表格中的函数。
函数 |
说明 |
name() |
返回此编码的官方名字。如果此编码已经在互联网号码分配 局( IANA ) 字符集编码文件中列出了,则应当使用其中的首选多用途互联网邮件扩展名字(preferred MIME name)作为名字。 |
aliases() |
返回此编码的替代名字列表。QTextCodec的默认实现是返回一个空列表。例如,"ISO-8859-1"的别名包括"latin1"、"CP819"、"IBM819"和"iso-ir-100"。 |
mibEnum() |
|
将一个8位字符的字符串转换成统一码。 |
|
将一个统一码字符串转换成8位字符编码的字符串。 |
妳会发现,把妳的编解码器做成一个插件来用会更方便;参考如何创建Qt插件。
参考QTextStream、QTextDecoder、QTextEncoder和编解码器示例。
搜索所有已安装的QTextCodec对象,返回其名字最符合name的那一个;匹配过程是无关大小写的。如果找不到名字与name匹配的编解码器,则返回0。
Your opinionsHxLauncher: Launch Android applications by voice commands