我对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:“系统” 在控制台中。
有什么想法吗?非常感谢你,拉尔夫
答案 0 :(得分:0)
几乎没有可能性:
echo -e '\xe2\x82\xac'
命令未显示€
,则应修复外壳)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