Qt 4.7字符串的Unicode转换
我们继承了一些用Qt4.7.4编写的遗留代码,这是无法更改的,因为存在太多的依赖项 该代码使用OGR库从Postgres读取一个字符字符串,然后使用Painter对象将其渲染到Qt中的画布上Qt 4.7字符串的Unicode转换,qt,unicode,utf-8,Qt,Unicode,Utf 8,我们继承了一些用Qt4.7.4编写的遗留代码,这是无法更改的,因为存在太多的依赖项 该代码使用OGR库从Postgres读取一个字符字符串,然后使用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
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,这是正确的重音
在Qt4.7.4中,如何将其转换为正确渲染的UTF-8 QString?我尝试过以下方法,但他们都将La Rosire甩给qDebug()
这里的问题是区分使用单个字节编码的字符和需要两个(或更多)字节编码的字符 从 “单字节代码仅用于ASCII值0到127” 大于127的代码点由多字节序列表示,由一个前导字节和一个或多个连续字节组成 ┌────────┬────────┬─────────┬─────────┬─────────┬─────────┬─────────┬────────┐ │一点点│弗斯特│最后│字节数│字节1│字节2│字节3│字节4│ │代码│代码│代码│序列│ │ │ │ │ │指向│指向│指向│ │ │ │ │ │ ├────────┼────────┼─────────┼─────────┼─────────┼─────────┼─────────┼────────┤ │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+1FFFF│4.│11110xxx│10xxxxxx│10xxxxxx│10xxxxxx│ └────────┴────────┴─────────┴─────────┴─────────┴─────────┴─────────┴────────┘ 因此,您需要确定当前字符是否是多字节Unicode字符的开头 快速脏伪代码
如果(图表点>127)
将此字符和下一个字符用作双字节Unicode字符
其他的
只使用这个字符
正确使用伪代码
if(字符的第一位为零)
只使用这个字符
else if(前两位为一)
将此字符和下一个字符用作双字节Unicode字符
else if(前三位为一)
将此字符和下两个字符用作三字节Unicode字符
else if(前三位为一)
将此字符和接下来的三个字符用作四字节Unicode字符
好的,我已经解决了这个问题,我感到很尴尬,因为我应该进一步阅读代码
程序员已初始化字符串,如下所示:-
= QString::fromStdString(...)
我用fromUtf8替换了fromstdString,一切都很好。这是UTF-8,因此从该字符数组构造QString的正确方法是
QString::fromUtf8()
。它是如何被打印出来的?谢谢,我得到了伪代码,但是我如何在QT中构建一个UTF-8qstring对象呢?我得到了理论,现在需要实际的帮助;-)目前无法访问Qt creator,但您可能需要QString::QString(const QChar*unicode,int size=-1)或QString::QString(const QByteArray&ba)
┌────────┬────────┬─────────┬─────────┬─────────┬─────────┬─────────┬────────┐
│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│
└────────┴────────┴─────────┴─────────┴─────────┴─────────┴─────────┴────────┘
= QString::fromStdString(...)