我有一个包含lineEdit
对象的代码。
该对象以任何语言(不能选择哪种语言)插入一个句子,因此它必须支持Unicode。
然后,我必须从中取出Unicode并将其写入文件中。
我的问题是lineEdit
将文本转换为纯ASCII并将其放入QSring
中,这样我才能一次又一次收到垃圾邮件。
以下是我要执行的操作的示例代码:
bool MainWindow::write_file(QString path, QString data)
{
QFile file( path );
if (file.open(QIODevice::WriteOnly))
{
QTextStream stream( &file );
stream << data.toUtf8() << endl; // tried this -> didn't work...
stream << data << endl;
}else
{
return false;
}
file.close();
return true;
}
void MainWindow::on_pushButton_clicked()
{
// ui->lineEdit->text bring to me the unicode into QString allready
// how can encode the data to utf-8 BEFORE it get into QString?
write_file(PYTHON_DB_COMMAND, ui->lineEdit->text());
}
答案 0 :(得分:2)
您正在混淆东西。
Qt绝对支持Unicode。 QLineEdit::text()
返回QString
,它是UTF-16代码单元的序列。您要弄错的是稍后的IO部分。特别是您误用了QTextStream
。
让我们搁置一会儿。在此处写下UTF-8内容的简单方法就是打开QFile
,然后直接将转换后的字符串写成UTF-8。
QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
file.write(data.toUtf8());
file.putchar('\n');
}
直接QFile
仅适用于字节序列,我们将其写入文件中(在文本模式下惯用的换行符翻译除外,但我在讲题); data.toUtf8()
会将您的字符串从UTF-16转换为UTF-8,并将其写到文件中而不必大惊小怪。
那么QTextStream
怎么了?好吧,QTextStream
的工作是提供帮助程序,以将类似文本的内容写入文件(在某种程度上,QTextStream
就是QIODevice
,std::ostream
就是{{1 }} 1 );这样,它提供了轻松输出std::streambuf
值的方法。
但是,QString
由UTF-16代码单元组成,而基础文件是面向字节的,因此需要进行转换。为此,QString
使用内部QTextStream
,如果未使用setCodec
,is QTextCodec::codecFromLocale()
进行显式设置,则内部it converts it to a QString
using its fromUtf8
method在Windows系统上通常是一些旧式编码(例如Windows -1252),无法表示大部分Unicode;因此输出中的问号。
即使显式使用QTextCodec
并将结果写在QString::toUtf8()
上也无济于事:由于它是为编写 text 而编写的,因此假设QTextStream
您传入的是UTF-8数据,因此README
,然后将其写入(因此,将使用上述编解码器对其进行转换)。
因此,如果要使用QByteArray
将QString
数据写入UTF-8文件中,正确的方法是先将其编解码器设置为UTF-8,然后直接输出您的QTextStream
:
QString
偶然地
QFile file(path);
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream( &file );
stream.setCodec("UTF-8");
stream << data << endl;
}
-除了输出换行符之外,它还强制执行文件刷新,通常这并不是您真正需要的东西(如果输出很多行,可能会降低写入性能); < / li>
endl
上显式调用close()
-它会在销毁时自动关闭(因此,在这种情况下,在方法末尾)。 注释
不幸的是,这并不完全正确。 QFile
是三头怪兽,它以类似于以下的方式包装“关联字符序列”(=基础流,例如OS文件)和“受控字符序列”(=缓冲) std::streambuf
,但它也根据QFile
语言环境方面处理代码页转换,从而完全混淆了事物的语义(std::codecvt
是字节序列还是文本字符序列?)并且实现复杂化。
与往常一样,iostream仍然很好地说明了如何不设计IO库。
答案 1 :(得分:1)
设置您的text stream encoding:
['xy', 'y', 'x', 'xy']
['+3', '+1', '-2', '+2']
答案 2 :(得分:-1)
在write_file的调用中,添加到第二个参数:
.utf16()
或.Unicode()
将您的QString
转换为Utf表示形式。
我不明白您对“一次又一次”的意思。