从lineEdit QT获取unicode并将其写入文件

时间:2018-11-29 14:10:30

标签: c++ qt

我有一个包含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());
}

3 个答案:

答案 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就是QIODevicestd::ostream就是{{1 }} 1 );这样,它提供了轻松输出std::streambuf值的方法。

但是,QString由UTF-16代码单元组成,而基础文件是面向字节的,因此需要进行转换。为此,QString使用内部QTextStream,如果未使用setCodecis QTextCodec::codecFromLocale()进行显式设置,则内部it converts it to a QString using its fromUtf8 method在Windows系统上通常是一些旧式编码(例如Windows -1252),无法表示大部分Unicode;因此输出中的问号。

即使显式使用QTextCodec并将结果写在QString::toUtf8()上也无济于事:由于它是为编写 text 而编写的,因此假设QTextStream您传入的是UTF-8数据,因此README,然后将其写入(因此,将使用上述编解码器对其进行转换)。

因此,如果要使用QByteArrayQString数据写入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()-它会在销毁时自动关闭(因此,在这种情况下,在方法末尾)。

注释

  1. 不幸的是,这并不完全正确。 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表示形式。

我不明白您对“一次又一次”的意思。