【发布时间】:2016-12-14 08:17:57
【问题描述】:
我要将 QString 转换为其十六进制表示,一切正常,直到我输入一些特殊字符,如“€”:
QString l_str = "How are you";
qDebug() << "hex: " << l_str.toUtf8().toHex();
qDebug() << "readable:" << l_str.toUtf8();
打印出来:
十六进制:“486f772061726520796f753f”
可读:“你好吗?”
因此很容易将十六进制值转换回 ascii,只是两个值(48 = H 等)ascii 字符的十六进制表示,它足以迭代和转换每两个字符。
如果我设置 l_str = "H€w ar€ you?",而 utf8 中的 hex € 符号是 "e282ac" 是 6 个值,结果如下:
十六进制:“48e282ac77206172e282ac20796f753f”
但是我怎样才能把它恢复成可读的字符串呢?
最好是转换成 utf16 字符串:
十六进制:“0048006F20AC00200061007220AC00200079006F0075003F”
考虑到“Ho€ ar€ you”字符串是在运行时创建的(所以没有可用的 QStringLiteral),我不能使用 auto 关键字。
【问题讨论】:
-
“将其恢复为可读字符串”究竟是什么意思?你怎么读字符串?
-
我从 Web 服务器读取“ho€ ar€ you”,然后我必须将其转换为 utf16 十六进制数组,将其发送到我必须将其转换回“ho€ ar”的设备欧元你”。
-
其中哪一个步骤失败了?
-
邮票没问题,我只是无法从十六进制 = 48e282ac77206172e282ac20796f753f 中取回原始字符串
-
Web 服务器提供 bytes,其中
Content-Type标头指定 byte 编码。因此,如果您收到带有Content-Type: text/plain; charset=utf-8之类的 HTTP 正文,那么您将知道这些字节是 UTF-8 并且可以使用QString::fromUtf8()将它们解码为QString。一旦你有了一个QString,你就可以使用QString::utf16()从中得到一个UTF-16数组。要将 UTF-16 解码回QString,您可以使用QString::fromUtf16()。
标签: string qt unicode hex ascii