1

我的编码有问题。我在我的应用程序中使用拖动和 drom,但有些文本文件无法打开,经过一番搜索后,我发现路径的编码错误。真正的文件是“Some_file - 01.txt”,但是当我尝试将此路径(放置后)打印到标准输出时,我会得到“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 '-' 是文件名一部分的文件。

编辑2:

如果我手动将文件名从“file.txt”更改为“file-.txt”,一切正常。但是当我(同一个文件)将此文件复制并粘贴到同一个文件夹时,Windows 将生成带有后缀的新名称:'file - copy.txt',并且这个文件我无法打开。所以 Windows 使用不同的字符来表示 '-' vz。'——'。

我可以做什么 ?

解决方案:

void openFile(string fileName) {
  ifstream fileio(fileName.c_str());
}

QString qtFileName = QFileDialog::getOpenFileName(...)
openFile(qtFileName.toLocal8Bit().constData());
4

1 回答 1

1

std::cout用一些本地编码进行编码。您需要的是将QString返回的toLocalFile()转换为本地 8 位编码。

例如:

QUrl url = ...;
QString filePath = url.toLocalFile();
QByteArray filePath8 = filePath.toLocal8Bit();
std::cout << filePath8.constData();

但实际上,整个练习并不是必需的,因为要访问您应该使用的文件QFile,它QString直接采用 a,控制台输出可以使用QTextStream. 以机智:

#include <cstdio>
#include <QTextStream>
#include <QFile>
QTextStream out(stdout);

void test() {
  out << filePath;

  QFile file(filePath);
  if (file.open(QIODevice::ReadOnly)) {
    ...
  }
}
于 2014-07-03T23:22:30.223 回答