【问题标题】:Qt Convert UTF16 Hex string to QStringQt 将 UTF16 十六进制字符串转换为 QString
【发布时间】:2016-08-01 11:48:52
【问题描述】:

我想将十六进制和 utf16 编解码器的字符串转换为 QString 例如,就像我从这段代码中获得的:

QString str1 = QString::fromWCharArray(L"\x0633\x0644\x0627\x0645"); // what I want

但是当我尝试以下代码时,一切都出错了,正确的方法是什么。

QByteArray hex =  QByteArray::fromHex("0633064406270645");
// wrong text in str2 it should be equal to str1
QString str2 = QString::fromUtf16((char16_t*)hex.data()); 

【问题讨论】:

  • 如果你只是这样做:QString str2(hex);?
  • 将str1转换为UTF16 QBytearray,使用toHex,比较是否得到0633。
  • @wasthishelpful 不,这根本不起作用
  • @hyde this str1.toLatin1().toHex();给了我'3f',但我实际上想要一种将 utf16 十六进制转换为 QString 的方法,我认为它已经包含 16 位字符。我怎样才能得到与 str1 相同的字符串

标签: c++ qt utf-16 qstring


【解决方案1】:

这段代码有什么问题?

QByteArray hex =  QByteArray::fromHex("0633064406270645");
// wrong text in str2 it should be equal to str1
QString str2 = QString::fromUtf16((char16_t*)hex.data());

字节序是!这相当于L"\x3306\x4406\x2706\x4506",而不是L"\x0633\x0644\x0627\x0645"

所以要解决这个问题,你可以在字符串中添加BOM

QByteArray hex =  QByteArray::fromHex("FEFF0633064406270645");
QString str2 = QString::fromUtf16((char16_t*)hex.data());

没有测试,但应该可以解决问题。

另一种解决方案是翻转单个 UTF-16 字符中的字节顺序(将其更改为小端序)。

QByteArray hex =  QByteArray::fromHex("3306440627064506");
QString str2 = QString::fromUtf16((char16_t*)hex.data());

【讨论】:

  • 哦,这是正确的,我错过了 QString::fromUtf16 文档中的这一行“此函数检查字节顺序标记 (BOM)。如果缺少,则假定主机字节顺序。谢谢你节省了我的时间。
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 2014-05-08
  • 1970-01-01
  • 2018-01-31
  • 2018-01-22
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多