gpt4 book ai didi

c++ - QFileInfo 和 UTF-8

转载 作者:行者123 更新时间:2023-12-05 04:21:40 26 4
gpt4 key购买 nike

我无法让 QFileInfo 使用 UTF-8 路径。
我在 Ubuntu 20.04 上。
虽然 std::filesystem 与(在这种情况下)德语 UTF-8 没有问题,但 QFileInfo 似乎没有使用 UTF-8,即使 Qt 文档说默认编码是 unicode ( https://doc.qt.io/qt-5/qtextcodec.html )

编辑:在文件示例之前,这是一个更简单的示例。这个例子表明 QString 不是问题,而是影响 Qt I/O 的设置:

QString temp {"Höhe.txt"};
qDebug()<<"Qt temp: "<<temp;
std::cout<<"Qt through std: "<<temp.toStdString()<<std::endl;
std::string str = temp.toStdString();
std::cout<<"std: "<<str<<std::endl;

结果:

Qt temp:  "Hhe.txt"
Qt through std: Höhe.txt
std: Höhe.txt

因此,qDebug() 省略了“Ö”,而 QString::toStdString() 正确提供了完整的字符串。

这是一个精炼的示例代码:在以下所有情况下,std::filesystem 都能找到文件,但 Qt 看不到它。
qDebug() 输出始终没有 'Ö' - 它只是 'Hhe.txt'
注意:我的真实代码没有使用字符串文字 - 下面的字符串文字仅用于示例以保持简单。

#include <QFileInfo>
#include <QtDebug>
#include <QTextCodec>
#include <filesystem>

int main(int argc, char **argv)
{
std::filesystem::path p{"Höhe.txt"};
//QFileInfo f(p.c_str());
//QFileInfo f(std::filesystem::u8path(p.c_str()).c_str());
//QFileInfo f(QString::fromUtf8(std::filesystem::u8path(p.c_str()).c_str()));
QByteArray encodedString = "Höhe.txt";
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
//QString file = codec->toUnicode(encodedString);
QString file = QString::fromUtf8(encodedString);
QFileInfo f(file);
if(!std::filesystem::exists(p)) {
return 1;
}
if(!f.exists()) {
qDebug()<<f.filePath(); //outputs 'Hhe.txt' for all cases
return 1;
}

std::cout<<"found"<<std::endl;
return 0;
}

任何人都可以帮助我让 QFileInfo 也能看到带有 unicode 字符的文件吗?

非常感谢!

一些附加信息(根据评论中的问题):

~$ locale
LANG=C
LANGUAGE=en:el
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

但一般来说,我的系统在控制台或 UI 中显示德语文本没有问题..

$ ls Höhe.txt | od -t c
0000000 c h i n e s e . e x t \n c z e c
0000020 h . e x t \n d u t c h . e x t \n
0000040 e n g l i s h _ u k . e x t \n f
0000060 i n n i s h . e x t \n f r e n c
0000100 h . e x t \n g e r m a n . e x t
0000120 \n g r e e k . e x t \n i t a l i
0000140 a n . e x t \n j a p a n e s e .
0000160 e x t \n p o l i s h . e x t \n p
0000200 o r t u g u e s e . e x t \n s p
0000220 a n i s h . e x t \n s w e d i s
0000240 h . e x t \n t u r k i s h . e x
0000260 t \n
0000262

和:

main.cpp: C source, UTF-8 Unicode text

最佳答案

来自 n.m. 的评论走在正确的轨道上。问题不在代码中,正如我最初认为的那样,而是我系统上的语言环境配置。

输出:

 QTextCodec::codecForLocale()->name().toStdString();

“系统”
不过,我不确定“系统”的配置是什么。
并在 UTF-8 上明确设置 Qt Locale:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

使代码在我的系统上也能正常工作。
这意味着问题出在我系统的语言环境配置中。
所以我必须弄清楚我的语言环境有什么问题,但这是另一个问题。

非常感谢所有提供帮助的人!!

关于c++ - QFileInfo 和 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74184038/

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