c++ QLocale代码仅限于2位数代码的区域

m3eecexj  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(154)

我想获得任何ISO 3166国家代码的国家名称。我的项目目前使用3位数代码,所以如果可能的话,从那里。根据Qt文档QLocale::countryToTerritory应该解决这个问题,但在我的测试程序中,它只适用于2位数代码。我也尝试了已弃用的codeToCountry函数,但它有相同的结果。而且数字代码没有任何结果。
下面是一个简单的测试程序:

#include <QCoreApplication>

#include <QLocale>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString l2 = "DE";
    QString l3 = "DEU";
    QString d3 = "276";

    qDebug() << QLocale::codeToCountry(l2) << QLocale::codeToCountry(l3) << QLocale::codeToCountry(d3);
    qDebug() << QLocale::codeToTerritory(l2) << QLocale::codeToTerritory(l3) << QLocale::codeToTerritory(d3);

    return a.exec();
}

输出为:

QLocale::Germany QLocale::AnyTerritory QLocale::AnyTerritory
QLocale::Germany QLocale::AnyTerritory QLocale::AnyTerritory

我尝试了几个不同的国家,结果都一样。
我用Qt 6.3.0和MSVC2019编译器在Windows上构建了这个项目。
是文档本身出错了,还是我遗漏了什么?

lx0bsm1f

lx0bsm1f1#

查看codeToTerritory的代码源,可以看到国家代码与 territory_code_list 中包含的代码列表进行了比较。此变量在qlocale_data_p. h中定义。
此列表中似乎只使用了ISO 3166-1 alpha-2代码(即2个字符的代码)。territory_code_list 中既没有“DEU”也没有“276”,这意味着返回了QLocale::AnyTerritory。
因此,我不知道文档是否有误,但至少它是不精确的。
EDIT:进一步挖掘,代码列表是从https://unicode.org/Public/cldr/生成的,这些文件只包含国家的2个字母的代码(有一些3位数的代码对应于大陆,但没有国家的代码)。

相关问题