Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Utf-8如何在Qt 5中不工作?_C++_Visual Studio_Qt_Utf 8_String Literals - Fatal编程技术网

C++ Utf-8如何在Qt 5中不工作?

C++ Utf-8如何在Qt 5中不工作?,c++,visual-studio,qt,utf-8,string-literals,C++,Visual Studio,Qt,Utf 8,String Literals,我有一个原始测试:msvc2015和Qt5.9.3中的项目。 main.cpp文件以Unicode格式保存为UTF-8,并带有签名: 我尝试显示消息框,它应该显示一些俄语文本。整个代码: #include <QtWidgets/QApplication> #include <QMessageBox> int main(int argc, char *argv[]) { QApplication a(argc, argv); QString ttl =

我有一个原始测试:msvc2015和Qt5.9.3中的项目。 main.cpp文件以Unicode格式保存为UTF-8,并带有签名:

我尝试显示消息框,它应该显示一些俄语文本。整个代码:

#include <QtWidgets/QApplication>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QString ttl = QString::fromUtf8("russian_word_1");
    QString txt = QString::fromUtf8("russian_word_2");

    QMessageBox::information(nullptr, ttl, txt);

    return a.exec();
}
我得到的是:

这怎么可能呢? 更新1:我想在BOM中使用UTF-8

…在不知道是什么的情况下使用字符串是没有意义的 它使用的编码���

更新2:
在这种情况下,很可能是编译器中的错误。

不要在代码中使用非英语ASCII。因为编译依赖于编译器、源文件编码等。只写英文文本,包装在。创建翻译文件,加载它们。了解

将QByteArray用于消息文本,然后将其作为unicode QString显示:

 int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec *codec1 = QTextCodec::codecForName("CP1256");
    // Converted Text:
    QByteArray myLanguage = "لا لا لا لا لا لا لا ";
    QString myLanguage2unicode = codec1->toUnicode(myLanguage);
    // Non converted text:
    QString txt = QString::fromUtf8("لا لا لا لا لا لا لا  ");

      QMessageBox::information(nullptr, myLanguage2unicode, txt);

    return a.exec();
}
上述代码的结果:


如果编译器为具有BOM表的UTF-8源文件生成垃圾字符串,则这是编译器中的错误。然而,首先使用带有UTF-8的BOM。除非你真的有理由,否则你不应该使用它

此外,您不需要进行显式的fromUtf8转换。您只需执行以下操作:

QString ttl = "russian_word_1";
QString txt = "russian_word_2";
QString假定字符串文本为UTF-8。从:

在所有采用const char*参数的QString函数中,const char*被解释为以UTF-8编码的经典C样式“\0”终止的字符串

您可以使用QStringLiteral包装字符串文字作为优化,但这不是必需的

最后,如果您想将应用程序从俄语翻译成其他语言,可以使用tr包装字符串文本。如果您以后决定进行翻译,通常最好使用tr

请注意,在源代码中使用非英语字符串通常是可以的。这就是UTF-8和Unicode的一般用途。所有现代编译器都支持它。然而,大多数人不喜欢的是非英语代码:


但是非英语字符串也可以。

如果您使用Qt Creator+MSVC编译器,这可能会对您有所帮助

TLDR:

将所有源文件保存为不带BOM的UTF-8 在.pro文件中添加此行: QMAKE_cxflags+/utf-8 完成了

参考文献:


顺便说一句,请确保您将应用程序编译为unicode,并且/或者您的操作系统配置为使用俄语作为非unicode程序的默认语言。我使用VS2012,Qt 5.6,代码保存为“UTF-8,无BOM”,并且我可以从QMessageBox中的代码显示德语umlauts:QMessageBox::informationthis,trSüß!,tr{196;Ê236;&78╬aúeKúYﭛᵴҺϸ̚Ƚ;-开箱即用。@MartinHennings是的,但我和BOM谈论UTF-8应该没有区别。Qt5将所有字符串文字解释为UTF-8,除非明确要求不要这样做,我相信VisualStudio会对其进行编码,而不管BOM如何。真正的原因必须在其他地方。@MartinHennings,我一直在没有BO的情况下工作M、 但今天我决定尝试:你确定这是只针对一种语言程序的最佳解决方案吗?@VladimirBershov是的,我认为这是唯一的方法。如果你使用的是像Visual Studio或QtCreator这样的IDE-s,那么它应该很容易使用。@VladimirBershov使用纯英语字符串和tr是一个很好的建议将它们转换为您的母语,但/在实践中/这也应该起作用。因此,不,这不一定是一种语言程序的最佳解决方案-出于多种原因,您需要更新/删除/分发,更难在生产中找到字符串,更难用非母语表达确切含义等等…@DmitrySazonov,谢谢,但我确信Unicode是永远解决问题的关键。每个编译器都应该提供Unicode的全面支持,尤其是使用BOM。在代码中只使用ASCII和使用翻译文件是非常好的建议,但不是出于这个原因。@Vladimirbersov您需要寻找一个答案,如何强制MSVC正确解释y我们的源文件。它与Qt无关。但是Stackoverflow作者的这句著名的话呢:关于编码的一个最重要的事实。@VladimirBershov在我们的例子中,我们知道它使用什么编码。它是UTF-8。是的,但我说的是全局正确性,我想在另一个IDE中使用我的项目too@VladimirBershov阿博M是一个字节顺序标记。它指定字节顺序。字节顺序与UTF-8无关,使用BOM会导致问题。就像ASCII文件不需要BOM一样,UTF-8也不需要BOM。只需在没有BOM的情况下使用UTF-8,并告诉您的IDE您的文件是UTF-8而不是ASCII。这是最简单的解决方案。@VladimirBershov,您知道吗“你可以随意忽略建议。我只是告诉你推荐的方法是什么。这取决于源文件和编译器的编码。文本编解码器不适用于此。@DmitrySazonov通常,对于简单来说,只有一种语言的程序,如果发现内部化成本很高的话。。然后,在编写非英语文本时,我
在源代码中,文本编解码器是一个很好的解决方案。。我确实使用了它们。@DmitrySazonov,以防万一我们不在同一页上,请看我的代码和输出快照,正如我在回答中更新的那样,这里的要点是它的有效性,而它当然不是便携式…等代码的最佳选择。@DmitrySazonov,检查一下,我认为依赖本地PC编码是一种非常糟糕的做法,因为它随时都可能改变。至少,源文件应该是utf8/16/32。谢谢,但我使用的是Visual Studio IDE。是的,UTF-8-no-BOM是Qt的最佳选项。
auto индекс = 0; // Please don't.