【发布时间】:2020-10-30 17:30:07
【问题描述】:
我看到 QByteArray 如何与 Ascii 字符相互转换 我看到了如何使用 QString::toUtf8() 将 QString 转换为 utf-8
但是,我看不到如何使用包含 unicode 字符的十六进制文字初始化 QByteArray。 unicode 字符太大而无法放入 char 中。然而,它们将适合无符号字符。
如果我运行以下代码:
QString test = "¢";
QByteArray utf8bytes = test.toUtf8();
我的调试器说:
utf8bytes = { (char)-62 '\302', (char)-94 '\242' }
不管那是什么意思……
我最终想要完成的是能够在以下单元测试代码中提供测试数据:
void stomp_frame_tests::test_nonAsciiCharactersInHeaderKey()
{
/* Frame we are testing with:
SEND
Bad¢Character:Erroneus
destination:/queue/a
content-type:text/json;charset=utf-8
content-length:22
This is a test message
*/
const char data[] = {0x53, 0x45, 0x4e, 0x44, 0x0a, 0x42, 0x61, 0x64, 0xc2, 0xa2, 0x43, 0x68, 0x61, 0x72, 0x61,
0x63, 0x74, 0x65, 0x72, 0x3a, 0x45, 0x72, 0x72, 0x6f, 0x6e, 0x65, 0x75, 0x73, 0x0a, 0x64,
0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x2f, 0x71, 0x75, 0x65,
0x75, 0x65, 0x2f, 0x61, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79,
0x70, 0x65, 0x3a, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3b, 0x63, 0x68,
0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x0a, 0x63, 0x6f, 0x6e,
0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x32, 0x32, 0x0a,
0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74,
0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00};
auto testData = QByteArray::fromRawData(data, sizeof(data));
}
这当然会失败,因为 0xc2 和 0xa2 太大而无法放入字符中。您将如何使用适当的数据初始化 QByteArray?
【问题讨论】:
-
0xc2 和 0xa2 还在一个字节的范围内,所以当然可以初始化为
QByteArray。调试器的输出是因为数据类型是char。如果您将其声明为unsigned char,您将看到您期望的值。 -
@wthung 你不能用 const unsigned char * 初始化一个 QByteArray,编译器会给你一个错误。
-
是的,你会得到一个编译器错误。但是我的观点是 char 或 unsigned char 只是一个字节。该值可以是 0xc2、194、-62,取决于您解释它的数据类型。
标签: qt