QT乱码问题

std::string转QString乱码

QString::fromLocal8Bit(std::string().c_str())

QString转std::string乱码

std::string(QString().toLocal8Bit())

 

 

程序乱码

 Qt5中关于中文的建议解决方案是:

1.用预处理命令  #pragma execution_character_set("utf-8")将cpp编码设置为utf-8

2.不用保证源码文件是UTF-8,但是源文件中出现中文用QStringLiteral这个宏来包含起来,那么也不会乱码

3. QString::fromLocal8Bit 根据本地文件的编码转成utf-8然后保存到QString中

 

GBK转UTF8

QString GBK2UTF8(const QByteArray &byteArray)
{
	QTextCodec *gbk = QTextCodec::codecForName("gbk");
	QString g2u = gbk->toUnicode(byteArray);
	return g2u;
}

 

这里是GBK转UTF-8,需要其他编码转换可以自己换名字

QString strGBK = QTextCodec::codecForName("GBK")->toUnicode(str);
QString strResult = QTextCodec::codecForName("UTF-8")->fromUnicode(strGBK);

GBK转UTF-8

QTextCodec::codecForName("GBK")->toUnicode(str);

 

UTF-8转GBK

QTextCodec::codecForName("GBK")->fromUnicode(str)

 

 

QTextCodec 类 - 编/解码小工具

概述

在 Qt 眼中只有两种编码:Unicode 和非 Unicode。Qt 自己内部都统一使用 Unicode 编码。要把非 Unicode 编码转换成 Qt 自己使用的 Unicode 编码,只需要设置下 QTextCodec 类采用什么非 Unicode 编码,然后一条函数代码即可搞定。

最常用的用法示例

我从来没见过比 QTextCodec 类更便捷的进行字符编码转换的类了。我们以俄语为例,想把一段俄文 KOI8-R 编码的字符串和 Unicode 编码的字符串相互转化,用区区几行代码就可以:

俄文 KOI8-R -> Unicode

QByteArray encodedStr = "......";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString str = codec->toUnicode(encodedStr);

Unicode -> 俄文 KOI8-R

QString str = "......";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QByteArray encodedStr = codec->fromUnicode(str);

有人问了,我想在俄文和中文之间进行转换,咋办?我就想说是不是傻?俄文 -> Unicode -> 中文不就可以了么。

 

支持的编码格式

Big5、Big5-HKSCS、CP949、EUC-JP、EUC-KR、GB18030、HP-ROMAN8、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、KOI8-R、KOI8-U、Macintosh、Shift-JIS、TIS-620、TSCII、UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE、Windows-1250 to 1258。

 

如何按照某种编码格式读写文件?

因为上面我们举的例子适合一段短小的文本,如果想以某种编码格式读写文件,此时可以使用 QTextStream 和 setCodec() 函数。参考官方示例:Codecs。

网络传输中的编码问题

网络传输的数据都是 0101010101,那我们怎么知道到了哪一个数据段就是一个字呢?而且如果出现分包的情况下,如果数据收的不完整而直接用 QTextCodec 转换可能会失败。为了解决这个问题,我们需要为 QTextCodec 创建一个 QTextDecoder 对象,使用这个对象来完成整个转码过程。因为 QTextDecoder 这个类会维护“数据块”之间的状态,即使一段完整的数据被拆分开也可以正常把它们拼接起来。示例代码如下:

QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QTextDecoder *decoder = codec->makeDecoder();

QString str;
while (new_data_available()) {
    QByteArray chunk = getNewData();
    str += decoder->toUnicode(chunk);
}

delete decoder;

如何自定义编码类?

因为这部分用的实在太少太少了,这里只说下如何做。首先肯定是要子类化 QTextCodec,然后实现如下的几个函数:

  • name()

返回编码的名称。如果你要自定义的编码在 IANA 字符集中有,那就返回其中的 MIME 名称。

  • aliases()

返回编码的别名。一个编码如果没有别名,那这个函数默认返回空。编码别名的例子有“ISO-8859-1”也叫“latin1”。

  • mibEnum()

返回编码的 MIB 枚举。

  • convertToUnicode()

将 8-bit 字符转换成 Unicode。

  • convertFromUnicode()

将 Unicode 转换为 8-bit 字符。

可以干什么?

  • 基本信息[static]
    • 可用的编/解码名称:QList<QByteArray> availableCodecs()
    • 可用的编/解码Mib:QList<int> availableMibs()
    • 设置本地编/解码:void setCodecForLocale(QTextCodec *c)
  • 获取 QTextCodec[static]
    • 适合某名称:QTextCodec * codecForName(......)
    • 适合本地 Locale:QTextCodec * codecForLocale()
    • 适合 BOM:QTextCodec * codecForUtfText(......)
    • 适合 HTML:QTextCodec * codecForHtml(......)
    • 适合 Mib:QTextCodec * codecForMib(int mib)
  • 转码
    • Unicode->非Unicode:QByteArray fromUnicode(......) const
    • 非Unicode->Unicode:QString toUnicode(......) const
  • 网络传输
    • 创建 QTextDecoder:QTextDecoder * makeDecoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
    • 创建 QTextEncoder:QTextDecoder * makeEncoder(QTextCodec::ConversionFlags flags = DefaultConversion) const
  • 其他
    • 转码设置:enum ConversionFlag { DefaultConversion, ConvertInvalidToNull, IgnoreHeader }
    • 判断是否可以转码:bool canEncode(......) const
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值