Qt 4.7字符串的Unicode转换

时间:2015-02-27 16:10:54

标签: qt unicode utf-8

我们继承了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"

2 个答案:

答案 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,一切都很好。