gpt4 book ai didi

Qt 的 QDir : File Names Dropping Non-Ascii Characters

转载 作者:行者123 更新时间:2023-12-04 23:53:08 25 4
gpt4 key购买 nike

我遇到 QDir 从我的文件名中丢失非 Ascii 字符的问题。

我有名称类似 testingöäüß.txt 或 exampleΦ.shp 的文件,当尝试使用 Qt 实用程序(如 QDir 和 QFile)时,它们只会显示为 testing.txt 和 example.shp。似乎我无法告诉这些类使用哪种编码。我正在尝试 QDirIterator 和 QDir 函数 entryInfoList:

   QDir someDir("/home/blah");  //contains testingöäüß.txt

QDirIterator dirIter(someDir.absolutePath(), QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files);
while(dirIter.hasNext())
{
QString fileName1 = QFile::decodeName(dirIter.next().toUtf8());
std::cout << "QDirIterator Name " << fileName1.toStdString().c_str() << std::endl;
}

QFileInfoList fileInfoList = someDir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files);
foreach(QFileInfo fileInfo, fileInfoList)
{
QString fileName1 = QFile::decodeName(fileInfo.fileName().toUtf8());
std::cout << "entryInfoList Name " << fileName1.toStdString().c_str() << std::endl;

QString fileName2 = QFile::decodeName(fileInfo.absoluteFilePath().toUtf8());
std::cout << "entryInfoList Name2 " << fileName2.toStdString().c_str() << std::endl;

QString fileName3 = QString::fromUtf8(dirIter.fileInfo().absoluteFilePath().toStdString().c_str());
std::cout << "entryInfoList Name3 " << fileName3.toStdString().c_str() << std::endl;
}

这些打印中的每一个都将缺少非 ascii 字符。似乎只要您尝试抓取文件名以循环它们,它们就只会是 ascii。有人对此有任何想法吗?或者 Qt 根本无法处理这个问题?谢谢!

最佳答案

我知道这是一个老问题,但我遇到了同样的问题。完全相同的 Qt 代码可以在我的开发 VM 上正常工作,但是当我将它转移到嵌入式 Linux 系统(在 x86 上运行,所以实际上是相同的可执行文件)时,我的目录名称只是默默地删除了它们的非 ASCII 字符。

原来是QTextCodec::codecForLocale在我的开发 VM 上设置为 UTF-8 ,在嵌入式盒子上是 System .如果我在执行任何文件系统操作(通过调用 QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")) )之前手动将语言环境更改为 UTF-8,则一切正常。

那么为什么会发生这种情况呢?我怀疑在精简嵌入式系统的根文件系统的过程中,我可能不小心删除了一些 Qt 用来尝试自动检测区域设置的与区域设置相关的文件。当它无法确定它是在 UTF-8 上时,它又回到了 System,无论出于何种原因它都坏了(也许是因为同样的原因,它首先无法检测到 UTF-8)。

我需要最终解决导致它无法自动检测的任何问题,但在短期内,如果您遇到同样的问题,只需手动设置 UTF-8 语言环境就可以了。

请注意,这与控制台是否可以显示 UTF-8 无关,也与手动将 UTF-16 转换为 UTF-8 无关! 所以 Felix 对这个问题的回答是不正确的,至少对于这个特定的问题是这样。为了完全从等式中删除控制台的功能,我还只是简单地打印了字符串中 UTF-16 字符的数量,并且每个非 ASCII 字符实际上都使从 QDir::entryInfoList 返回的路径和文件名字符串少了一个UTF-16 字符。此外,致命的赠品是字符被简单地剥离了,而不仅仅是用垃圾或问号或其他任何东西替换。

关于Qt 的 QDir : File Names Dropping Non-Ascii Characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com