【发布时间】:2016-02-24 20:18:50
【问题描述】:
我需要比较两个包含宏字符(Ā、Ō、Ū)的 UTF-8 编码字符串。顺序应该是 A
为了实现这一点,我尝试使用localeAwareCompare:
QString a = QString::fromUtf8("Ā");
QString b = QString::fromUtf8("O");
int result = QString::localeAwareCompare(a, b);
使用这段代码,我在运行 Mac OS 和 android 的台式计算机上遇到了不同的行为。在台式计算机上,结果是 -1(这是正确的,因为 Ā
localeAwareCompare 的 Qt 文档包含以下注释:
The comparison is performed in a locale- and also platform-dependent manner.
我使用的设备上的默认语言环境是:
- Mac 操作系统:
- 名称:en_US
- 脚本:7
- 国家:美国
- 安卓:
- 姓名:“”
- 脚本:0
- 国家:任何国家
手动将默认语言环境设置为 en_US 没有帮助。我唯一的猜测是这是由于平台依赖性。
我在这里不知所措。这种行为应该是正确的吗?如果是这样,是否有另一种选择来计算所需的比较?
示例
#include <QApplication>
#include <QString>
#include <QDebug>
int main(int argc, char** argv) {
QApplication app(argc, argv);
QString a = QString::fromUtf8("A");
QString a_m = QString::fromUtf8("Ā");
QString o = QString::fromUtf8("O");
qDebug() << (QString::localeAwareCompare(a, a_m) < 0 ? "A < Ā" : "Ā < A");
qDebug() << (QString::localeAwareCompare(a_m, o) < 0 ? "Ā < O" : "O < Ā");
return app.exec();
}
【问题讨论】:
-
您使用的是哪个 Qt 版本? This SO post 表明某些 Qt 版本似乎已损坏。我用 Qt 4.8.6 和 Qt 5.2.1 测试了你的例子,得到了不同的结果。
-
我使用的是 Qt 5.5.1。 “不同的结果”是什么意思?你得到正确的结果了吗?
-
嗯,公平地说,我似乎总是在 Qt5 上得到 -1,但我在 Qt4 上得到 -79,除非我添加
QLocale::setDefault()语句。如果我加上它,我也会在 Qt4 上得到 -1。但是我的代码可能也与您的不同。可以发minimal, complete and verifiable example吗? -
这个问题现在包含一个例子。