如何打开具有unicode符号名称的文件

时间:2010-07-12 08:05:38

标签: c++ qt unicode

我为该.exe文件创建了一个.exe文件和相关的.myFile扩展名。我想双击任何.myFile文件,并通过.exe打开该文件。为此,我做了以下事情:

int main(int argc, char *argv[])
{
    QString fileName(QObject::tr(argv[1]));
    if ( fileName != "" )
    {
        mainWin.loadFile(fileName);
    }
.................. 
}

但是当我用unicode字符命名我的文件时(例如“Здравствуй.myFile”),而不是“Здравствуй”你可以看到“????????”。如何解决这个问题呢?我知道这是解决问题的原因,例如,MS Word就是这样做的。

3 个答案:

答案 0 :(得分:8)

以前关注int main(int argc, char** argv)的答案是不必要的复杂。 Qt有更好的选择。

来自Qt文档:On Windows, the QApplication::arguments() are not built from the contents of argv/argc, as the content does not support Unicode. Instead, the arguments() are constructed from the return value of GetCommandLine().

所以,正确的答案是使用qApp.arguments().at(1),它会在QString中为您提供Unicode文件名。

答案 1 :(得分:1)

您必须在Windows上使用wmain而不是main

int wmain(int argc, wchar_t** argv) {
    QString fileName = QString::fromWCharArray(argv[1]);  // untested

如果您必须遵循C标准(在Windows上几乎无用),则可以使用GetCommandLineWCommandLineToArgvW代替。

答案 2 :(得分:0)

假设您传入的unicode实际存储为UTF-8,请尝试使用QString :: fromUtf8读取参数,如下所示:

int main(int argc, char *argv[])
{
    QString fileName(QObject::trUtf8(argv[1]));
    if ( fileName != "" )
    {
        mainWin.loadFile(fileName);
    }
    // stuff
}

QObject :: trUtf8实际上是一个包装器,它将利用QString:fromUtf8并仍然执行翻译(即使我不明白你为什么要翻译文件名)