如何在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();
}
但是,当我打开结果文件时,我看到:
???? ????
出了什么问题?如何才能将我的角色正确保存在文件中?
答案 0 :(得分:1)
QString
具有unicode支持。因此,使用 * :
QString m = "سلام علیکم";
大多数现代编译器使用UTF-8编码此普通字符串文字(您可以使用u8"سلام عليكم"
在C ++ 11中强制执行此操作,请参阅here)。字符串文字具有char
s数组的类型。当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中,基本字符集中的任何源文件字符都被通用字符名称指定字符,基本字符集定义如下:
N4140§2.3[lex.charset] / 1
基本源字符集由96个字符组成:空格 字符,表示水平制表符,垂直制表符,换页符和换行符的控制字符,以及以下91个图形字符:
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
_ {} []#()&lt; &GT; %:; 。 ? * + - / ^&amp; | 〜! =,\“'
这意味着像:
这样的字符串QString m = "سلام عليكم";
将被翻译为:
QString m = "\u0633\u0644\u0627\u0645\u0020\u0639\u0644\u064a\u0643\u0645";
假设源文件采用支持存储UTF-8等字符的编码进行编码。