Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 4.7字符串的Unicode转换_Qt_Unicode_Utf 8 - Fatal编程技术网

Qt 4.7字符串的Unicode转换

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

我们继承了一些用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   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(...)