QUrl,正确编码路径

时间:2014-07-03 15:48:19

标签: qt utf-8 character-encoding qurl

我遇到编码问题。我在我的应用程序中使用拖动和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());

1 个答案:

答案 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)) {
    ...
  }
}