我想获得任何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上构建了这个项目。
是文档本身出错了,还是我遗漏了什么?
1条答案
按热度按时间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位数的代码对应于大陆,但没有国家的代码)。