【问题标题】:pass unicode arguments to QApplication将 unicode 参数传递给 QApplication
【发布时间】:2018-11-22 13:49:18
【问题描述】:

我有接受 unicode 字符作为参数的 Windows 控制台应用程序

 wmain( int argc , wchar_t ** argv)

现在我想将 argv 参数传递给我的 QApplication 。但是 QApplication 接受 char ** 。

我该如何做到这一点?

【问题讨论】:

  • 要么使用main(),要么将wchar_ts“翻译”成chars。我无法想象QApplication 需要与非 ASCII 值相关的命令行参数,但实际上我不确定。文件路径是个例外。
  • Windows 上的 IIRC QApplication::arguments 已经支持 Unicode。编写可移植代码,使用int main(int argc, char**argv),Qt 会神奇地让它工作。
  • 根据this answer,构造函数参数不用于构造QApplication::arguments()。所以你也可以不打扰。

标签: c++ qt unicode


【解决方案1】:

您不需要将这些参数传递给QApplication 构造函数。您可以传递一个虚拟数组,因为它不在 Windows 上使用。通过 main 参数传递的 C 样式程序参数不是 Windows 原生访问参数的方式,QApplication 不使用它。基于wchar 的main 是一个杂项,试图分散人们对argv 不是本机接口这一事实的注意力。

这行得通:

int argcc = 1;
char arg0[1] = "";
char *argvc[2] = {&arg0, nullptr};
QApplication app(argcc, argvc);

【讨论】:

    【解决方案2】:

    在QTBUG-3200 修复之前,唯一不受“非Unicode 的当前语言环境”字符集限制的方法似乎是将参数转换为UTF-8,然后

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));
    QApplication(argc, argv_converted);
    

    不过,我目前无法验证它是否会起作用。

    【讨论】:

      【解决方案3】:

      Qt 不像往常一样对 Unicode 字符串使用 wchar_t*。只有 QString 或 char*。如果你想转换 QString -> char*(或 char* -> QString)使用QTextCodec。 例如,旧版本的 Windows 有编码 cp866 用于控制台,如果你想将 unicode QString 发送到命令行:

      QString string = "Unicode text";
      QTextCodec *codec = QTextCodec::codecForName("cp866");
      QByteArray encodedString = codec->fromUnicode(string);
      //encodedString.data() - char* representation of unicode QString
      

      要读取main() 中的输入参数,请像这样转换:

      QTextCodec *codec = QTextCodec::codecForName("cp866");
      QString strArg = codec->toUnicode(argv);
      

      【讨论】:

      • 我认为你应该提到QChar*,它是wchar_t*的直接Qt替代品。
      • 另请注意,代码页 866 是西里尔文;这是全球极少数 PC 的默认设置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2012-09-12
      相关资源
      最近更新 更多