由于项目需要,需要对网络资源进行解码。遇到编码问题。研究了下基本编码原理。于是有了下面两个通用代码
1. 16进制unicode转换为utf-8中文显示
QString unicodeToUtf_8(const QString &resStr)
{
// unicode转utf-8 思路: 一个unicode编码占用2字节。所以只需要用4个16进制数字结合表示就行了
QString temp;
for (int i = 0; i< resStr.length();)
{
if (resStr.at(i) == '\\')
{
QString str = resStr.mid(i+2, 4);
temp.append(str.toUShort(0, 16));
i += 6;
}
else
{
temp.append(resStr.at(i));
++i;
}
}
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString desStr = codec->fromUnicode(temp);
return QObject::trUtf8(desStr.toLatin1().data());
}
2. 如何显示网络中返回的16进制unicode编码的音标??
QString getTheDecodeSymbol(const QString &resStr)
{
// 如何把16进制的unicode编码音标显示在窗口中?
// 比如: \u00a0[\u026an\u02c8ta\u026at(\u0259)lm\u0259nt]
// 解码思路如下: 先把16进制unicode编码转换为 10进制unicode编码
// 转换方法就是下面的代码
// 那么如何显示呢?
// 借助QLabel的设置字体
// tr("<span style='font-family:\"MS Mincho\";'>%1</span>").arg(data);即可
QString desStr;
for (int i = 0; i< resStr.length();)
{
if (resStr.at(i) == '\\')
{
QString str = resStr.mid(i+2, 4);
desStr.append(tr("&#%1;").arg(str.toInt(0, 16)));
i += 6;
}
else
{
desStr.append(resStr.at(i));
++i;
}
}
return desStr;
}