localeAwareCompare的不同结果
Different results of localeAwareCompare
本文关键字:结果 localeAwareCompare 更新时间:2023-10-16
我需要比较两个包含宏字符(Ā,Ō,Ū)的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.
我正在使用的设备上的默认区域设置是:
- 苹果操作系统:
- 姓名: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();
}
您可以通过分解字符串来删除宏:
QString a = QString::fromUtf8("Ā");
QString norm = a.normalized(QString::NormalizationForm_D);
QString aOut;
// Remove all marks
Q_FOREACH(QChar ch, norm){
QChar::Category c = ch.category();
if (c != QChar::Mark_Enclosing &&
c != QChar::Mark_NonSpacing &&
c != QChar::Mark_SpacingCombining){
aOut.append(ch);
}
}
qDebug() << aOut; // prints "A"
然后正常比较字符串。但是,这也会破坏诸如Æ之类的字素。需要更复杂的算法来避免这种情况。
供参考:http://doc.qt.io/qt-5/qstring.html#normalized
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 尝试将字符串/字符转换为整数会产生意外结果