【问题标题】:QT 4 <->QT 5 EncodingQT 4 <->QT 5 编码
【发布时间】:2019-07-17 15:50:22
【问题描述】:

我试图说明 QT4 和 QT5 的使用情况。该系统使用这两个版本,但它们位于共享公共文件的单独产品中。

我找到了一个可行的解决方案,但它每次都必须进行版本检查,我想找到一种方法来实现“一个编码适合两者”的场景。

我目前的解决方案是这样的,以微型符号 (µ) 为例。

QT 4 编码只需要字节的半字节,在这种情况下是 (\xb5)

Qt 5 需要整个字节 (\xc2\xb5)。

我也尝试过使用 C++ 代码 (\u00B5),但产生了 Î 1/4

c++

#include <QtCore/QtGlobal>
#if QT_VERSION >= 0x050000
print out a QString with the code \xc2\xb5
#else
print out a QString with the code \xb5
#endif

有没有更好的方法来避免版本检查?我想消除大约 50 项此类检查。

【问题讨论】:

  • \xb5 是一个字节,\xc2\xb5 是 2 个字节。 U+C2B5 不是有效的 Unicode 字符:fileformat.info/info/unicode/char/c2b5/index.htm
  • 好的,但是这个解决方案有效,我只是想找到一个更好的方法
  • @RichardCritten 该站点是错误的,它是一个有效的字符(它甚至显示为这样!)。见what unicode-table.com thinks of it。但无论如何,你检查错了:C2 B5 是一个 UTF-8 字符串,对应于 U+00B5 代码点。

标签: c++ qt


【解决方案1】:

问题在于,默认情况下,Qt4 中的 QString 在使用 char*const char* 参数时,将它们视为 ASCII 字符串(参见 the docs),而在 Qt5 中它们是 UTF-8 字符串( the docs)。所以你认为“只需要字节的半字节”实际上是“需要字符的 ASCII 值”。 µ 字符在 Latin1 中具有代码 0xB5,这是 Qt4 ASCII 的默认代码页。而C2 B5就是这个字符对应的码位的UTF-8表示。

所以你真正需要做的是避免构造函数QString::QString(const char*),而是显式使用QString::fromUtf8

【讨论】:

  • 我尝试在我的 .ini 文件(生成 cpp,h)中说 text=columnTitle (""QString::fromUtf8("\xb5")""s) 它返回了一个错误,我在QString之前我错过了一个)。使用 text=columnTitle (""\xb5""s) 不会发生此错误
  • @Yeet 因为您将 Latin1 字符串提供给需要 UTF-8 的函数。
  • 那我怎样才能在 UTF-8 中返回呢?使用 .ini 生成文件有问题吗?
  • 是否可以尝试使用 mu 编码而不是微秒?
  • @Yeet 你在 OP 中说\xc2\xb5 在 Qt5 中工作——为什么不现在使用它呢?它 micro sign 的 UTF-8 表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多