我们继承了QT 4.7.4中编写的一些遗留代码,由于依赖性太多,因此无法更改。
代码使用OGR库从Postgres读取一个char字符串,然后使用Painter对象将其渲染到Qt中的画布。
The name La Rosière is read in as follows:-
CHAR 0 'L' : 76
CHAR 1 'a' : 97
CHAR 2 ' ' : 32
CHAR 3 'R' : 82
CHAR 4 'o' : 111
CHAR 5 's' : 115
CHAR 6 'i' : 105
CHAR 7 '' : 195
CHAR 8 '' : 168
CHAR 9 'r' : 114
CHAR 10 'e' : 101
正如你所看到的,字符7和8是十六进制的c3 a8,是正确的重音è
在Qt 4.7.4中,如何将其转换为正确呈现的UTF-8 QString?我尝试了以下但他们都将La Rosire转储到qDebug()
QString::fromLatin1();
QString::fromStdString();
QString::fromUtf8();
QObject::tr();
QPainter is printing characters 7 and 8 separately Like "La RosiA^re"
答案 0 :(得分:0)
这里的问题是区分用单个字节编码的字符和需要两个(或更多)字节编码的字符。
来自http://en.wikipedia.org/wiki/UTF-8
“单字节代码仅用于ASCII值0到127”
“大于127的代码点由多字节序列表示,由前导字节和一个或多个连续字节组成”
┌────────┬────────┬─────────┬─────────┬─────────┬─────────┬─────────┬────────┐ │Bits of │First │Last │Bytes in │Byte 1 │Byte 2 │Byte 3 │Byte 4 │ │code │code │code │sequence │ │ │ │ │ │point │point │point │ │ │ │ │ │ ├────────┼────────┼─────────┼─────────┼─────────┼─────────┼─────────┼────────┤ │7 │U+0000 │U+007F │1 │0xxxxxxx │ │ │ │ ├────────┼────────┼─────────┼─────────┼─────────┼─────────┼─────────┼────────┤ │11 │U+0080 │U+07FF │2 │110xxxxx │10xxxxxx │ │ │ ├────────┼────────┼─────────┼─────────┼─────────┼─────────┼─────────┼────────┤ │16 │U+0800 │U+FFFF │3 │1110xxxx │10xxxxxx │10xxxxxx │ │ ├────────┼────────┼─────────┼─────────┼─────────┼─────────┼─────────┼────────┤ │21 │U+10000 │U+1FFFFF │4 │11110xxx │10xxxxxx │10xxxxxx │10xxxxxx│ └────────┴────────┴─────────┴─────────┴─────────┴─────────┴─────────┴────────┘
因此,您需要确定当前字符是否是多字节Unicode字符的开头
快速和肮脏的伪代码
if (CharToInt > 127)
Use this and the next char as a two byte Unicode Character
else
Use just this character
正确执行伪代码
if (first bit of char is zero)
Use just this character
else if (first two bits are one)
Use this and the next char as a two byte Unicode Character
else if (first three bits are one)
Use this and the next two chars as a three byte Unicode Character
else if (first three bits are one)
Use this and the next three chars as a four byte Unicode Character
答案 1 :(得分:0)
好的,我已经解决了这个问题并且很尴尬,因为我应该进一步阅读代码。
程序员初始化字符串如下: -
= QString::fromStdString(...)
我将fromstdString替换为fromUtf8,一切都很好。