Qt5:德语Umlaute(ä,ö,üchar)和QStrings出现问题

时间:2019-12-09 11:59:20

标签: qt

我对Qt5,QStrings和德国Umlaute(例如ä,ö和ü-char)有疑问。我读取了一个1024字节标题的数据,在应用程序中以表格形式显示它并编辑了一些条目。每次我在QLineEdit中编写德语Umlaut并对其进行处理时,我都会得到2个字节而不是1个字节-因为自Qt5以来,QString的每个字符确实需要2个字节。

我已经尝试过了:

QString str = rs_Position1_QLE->text();
QByteArray ba = str.toLatin1();
qDebug() << "ba:" << ba;

控制台:ba:“ S \ xF6ndenlabor” \ xF6代表字符ö (将带有标题的文件保存为ö而不是F6的EF BF BD)

但是即使那样,对于每个ASCII码高于127的字符,我也会得到2个字节。

我该如何解决我的问题?

非常感谢您的回答! 拉尔夫

很抱歉延迟!我制作了一个小示例脚本,希望对您有所帮助:

Stringtest::Stringtest(QWidget *parent)
    : QMainWindow(parent) {

    this->setWindowTitle("Stringtest");

    QWidget *window = new QWidget;
    QVBoxLayout *layout = new QVBoxLayout;

    QPushButton *OpenFile_QPB = new QPushButton("Open File");
    OpenFile_QPB->setFixedSize(100, 50);

    Content_QLE = new QLineEdit;
    Content_QLE->setMaxLength(20);
    Content_QLE->setMinimumWidth(200);
    Content_QLE->setMaximumWidth(200);
    Content_QLE->setStyleSheet("padding: 5px; font-family: 'Segoe UI', 'Arial', 'Verdana'; font-size: 12px; background-color: white;
border: none; ");

    QPushButton *SaveToFile_QPB = new QPushButton("Save to File");
    SaveToFile_QPB->setFixedSize(100, 50);

    layout->addWidget(OpenFile_QPB);
    layout->addWidget(Content_QLE);
    layout->addWidget(SaveToFile_QPB);

    window->setLayout(layout);
    this->setCentralWidget(window);

    connect(OpenFile_QPB, SIGNAL(clicked()), this, SLOT(OpenFile()));

}

Stringtest::~Stringtest() { }

void
Stringtest::OpenFile() {

    QString fileName = QFileDialog::getOpenFileName(this, "Open file", "C://Semroch.R", "Textfiles (*.txt);; All files (*.*)");

    if (fileName.isEmpty())
        return;
    else {
        QFile file(fileName);
        file.open(QFile::ReadOnly);
        qDebug() << "system name:"      << QLocale::system().name();
        qDebug() << "codecForLocale:"   << QTextCodec::codecForLocale()->name();
        while (!file.atEnd()) {
            QByteArray qbaLine = file.readLine();
            qDebug() << qbaLine;
            Content_QLE->setText(qbaLine);
            // QString strLine = qbaLine;
            // Content_QLE->setText(strLine);
        }
    }

} // End of void Stringtest::OpenFile()

我有一个test.txt文件,我将其加载到脚本中-文本文件的内容为abcdefä。 QLineEdit中的显示为: abcdef和钻石中的问号。 qDebug()显示给我 系统名称:“ de_DE” codecForLocale:“系统” 在控制台中。

有什么想法吗?非常感谢你,拉尔夫

2 个答案:

答案 0 :(得分:0)

几乎没有可能性:

  • 请确保您的外壳处理utf-8(如果echo -e '\xe2\x82\xac'命令未显示,则应修复外壳)
  • 请确保在您的应用程序中正确处理UTF-8(在您的main()函数中添加这些行):
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

答案 1 :(得分:0)

首先要了解的是QByteArray只是字节的集合,它没有说明其内容或所使用的编码,而QString是存储为UTF-16的Unicode字符串。

因此,当您执行Content_QLE->setText(qbaLine)QString strLine = qbaLine时,将隐式地将QByteArray转换为QString。根据{{​​3}},它调用QString::fromUtf8()

因此,如果您的文件未编码为UTF-8,而编码为拉丁文1,则将出现问题。 如果您的文件是拉丁文1,则应该执行以下操作:Content_QLE->setText(QString::fromLatin1(qbaLine))

写文件时也是如此:

file.write(str.toUtf8()); // Write to a UTF-8 file
file.write(str.toLatin1()); // Write to a Latin 1 file