我遇到编码问题。我在我的应用程序中使用拖动和drom但是我无法打开一些文本文件,经过一些搜索后我发现路径编码错误。真正的文件是'Some_file - 01.txt',但是当我尝试将此路径(删除后)打印到stdout后,我将获得'Some_file - 01.txt'。我想念的是:
void MainWindow::dropEvent(QDropEvent *event) {
QList<QUrl> urls = event->mimeData()->urls();
...
cout << paths[1].toLocalFile() << endl; /* Some_file – 01.txt */
cout << paths[1].toEncoded() << endl; /* Some_file%20%E2%80%93%2001.txt */
}
我也尝试QString :: fromLatin1或fromUtf8但没有成功。 我正在使用QT 4.7.0和Windows 7。
修改
这是我的主要设置:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
不幸的是,即使这对我不起作用:
QString fileName = QFileDialog::getOpenFileName(this, tr("Load EEPROM from HEX file"), "", tr("HEX file (*.hex)"));
ifstream hexFile(fileName.toStdString().c_str());
我无法打开char' - '是文件名的一部分的文件。
EDIT2:
如果我将文件名从'file.txt'手动更改为'file-.txt',一切都运行良好。但是当我(同一个文件)将此文件复制并粘贴到同一文件夹时,Windows将生成带有postfix的新名称:'file - copy.txt',此文件我无法打开。所以Windows使用不同的字符' - 'vz。 ' - '。
我能做什么?
解决方案:
void openFile(string fileName) {
ifstream fileio(fileName.c_str());
}
QString qtFileName = QFileDialog::getOpenFileName(...)
openFile(qtFileName.toLocal8Bit().constData());
答案 0 :(得分:1)
std::cout
使用一些本地编码进行编码。您需要的是将QString
返回的toLocalFile()
转换为本地8位编码。
例如:
QUrl url = ...;
QString filePath = url.toLocalFile();
QByteArray filePath8 = filePath.toLocal8Bit();
std::cout << filePath8.constData();
但实际上,整个练习都没有必要,因为要访问您应该使用QFile
的文件,直接使用QString
,并且可以使用QTextStream
来完成控制台输出。即:
#include <cstdio>
#include <QTextStream>
#include <QFile>
QTextStream out(stdout);
void test() {
out << filePath;
QFile file(filePath);
if (file.open(QIODevice::ReadOnly)) {
...
}
}