如何在 QString 中使用语言(如阿拉伯语或中文)?

How can I use languages (like arabic or chinese) in a QString?

如何在 QString 中使用语言(如阿拉伯语或中文)?

我正在创建 QString:

QString m = "سلام علیکم";

然后我使用以下方法将其保存到文件中:

void stWrite(QString Filename,QString stringtext){
    QFile mFile(Filename);

    if(!mFile.open(QIODevice::WriteOnly | QIODevice::Append |QIODevice::Text))
    {
        QMessageBox message_file_Write;
        message_file_Write.warning(0,"Open Error"
                                   ,"could not to open file for Writing");
        return;
    }
    QTextStream out(&mFile);
    out << stringtext<<endl;
    out.setCodec("UTF-8");

    mFile.flush();
    mFile.close();
}

但是,当我打开结果文件时,我看到:

???? ????

出了什么问题?如何让我的角色在文件中正确保存?

QString 支持 unicode。所以, *:

没有错
QString m = "سلام علیکم";

大多数现代编译器使用 UTF-8 编码此 普通字符串文字(您可以在 C++11 中使用 u8"سلام عليكم" 强制执行此操作,请参阅 here). The string literal has the type of an array of chars. When QString is initialized from a const char*,它期望数据以 UTF-8 编码。一切都按预期工作。

Qt中所有的输入控件和文本绘制方法都可以接受这样的字符串并显示,没有任何问题。有关受支持语言的列表,请参阅 here

至于你把这个字符串写入文件的问题,你只需要将你正在写入的数据的编码设置为可以编码这些国际字符的编解码器(例如UTF-8)。

来自 docs,当使用 QTextStream::operator<<(const QString& string) 时,字符串在写入流之前使用 分配的编解码器 进行编码。

您遇到的问题是您在分配之前使用了 operator<<。在 写作之前,您应该setCodec 。您的代码应如下所示:

void stWrite(QString Filename,QString stringtext){
    QFile mFile(Filename);

    if(!mFile.open(QIODevice::WriteOnly | QIODevice::Append |QIODevice::Text))
    {
        QMessageBox message_file_Write;
        message_file_Write.warning(0,"Open Error"
                                   ,"could not to open file for Writing");
        return;
    }
    QTextStream out(&mFile);
    out.setCodec("UTF-8");
    out << stringtext << endl;

    mFile.flush();
    mFile.close();
}

*translation phase 1 中,任何不在 基本字符集 中的源文件字符都被替换为 universal-character-name指定字符,基本字符集定义如下:

N4140 §2.3 [lex.charset]/1

The basic source character set consists of 96 characters: the space character, the control characters representing horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters:

a b c d e f g h i j k l m n o p q r s t u v w x y z

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

0 1 2 3 4 5 6 7 8 9

_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’

这意味着像这样的字符串:

QString m = "سلام عليكم";

将被翻译成类似:

QString m = "\u0633\u0644\u0627\u0645\u0020\u0639\u0644\u064a\u0643\u0645";

假设源文件采用支持存储此类字符的编码进行编码,例如 UTF-8。