QTextEdit does not display german Umlauts (öÖüÜäÄß) after loading a textfile
-
I'm working on a small app that saves and opens reports in HTML format from within a QTextEdit. I'm on Windows, using Qt 5.7 with Qt Creator v4.1.0.
Problem: Even though Umlauts are shown correctly in my QTextedit, they are replaced by diamonts an question marks after beein reloaded into the QTextEdit. I'm using QTextStream->toHtml to save the file and file.readAll().constData() to get them back, putting the gathered string back to QTextEdit with setHtml.
Here's part of my code:
SAVE:
// Datei speichern void MainWindow::on_actionSpeichern_triggered() { QString fileName = QFileDialog::getSaveFileName(this, trUtf8("Datei speichern"), "", trUtf8("Reportdatei (*.bmi)")); if (fileName != "") { QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { // error message } else { QTextStream stream(&file); stream.setAutoDetectUnicode(true); stream << ui->textEdit_Report->toHtml(); stream.flush(); file.close(); } } }
LOAD:
// Report laden void MainWindow::on_actionReport_importieren_triggered() { QString fileName = QFileDialog::getOpenFileName(this, trUtf8("Datei öffnen"), "", trUtf8("Reportdatei (*.bmi)")); if (fileName != "") { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, tr("Fehler"), tr("Report konnte nicht geöffnet werden")); return; } QString contents = file.readAll().constData(); ui->textEdit_Report->setHtml(contents); file.close(); } }
I researched on Codec and Locale a bit, but can't figure out what to do. Any help appreciated!
-
@kshegunov said in QTextEdit does not display german Umlauts (öÖüÜäÄß) after loading a textfile:
QString contents = QString::fromUtf8(file.readAll());
PERFECT! This solves my issu. Thanks a lot! :)
-
QTextEdit doesn't display these characters because of extended ASCII codes, I mean greater than 127.
When you encounter such characters you can convert them to QChar and add them to the QString. -
@mulfycrowh Thanks for your hint! :)
QTextEdit displays äÄöÖüÜß when I type them in or put them via QString. it does NOT display them anymore after I saved the text into a file and reload this file. The saved file looks like this:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><title>Report</title><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:14px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:large; font-weight:600; color:#0000ff;">Haus "An Mühlendiek" - Gewichte und BMI der Kunden</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#0000ff;">bearbeitet am Sonntag, 25.09.2016 für </span><span style=" font-weight:600; color:#0000ff;">September 2016</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">=================================================================================<br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Musterfrau, Frieda Annakatrin</span> | Gewicht: <span style=" font-weight:600;">103.20</span> kg | BMI: <span style=" font-weight:600;">27.71</span> | erfasst am 25.09.2016</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#0000ff;">------------------------------------------------------------------------------------------------------------------------------------------------------------------</span></p></body></html>
By the way - the same app displays everything well when compiled under Linux. so I guess it has to to with encoding the charset. Is there a Way to force QTextEdit to use Windows system charset?
-
I think the problem you have is that when using QTextStream you write the content you store in an encoding that is different from what you get when calling file.readAll().constData() (because that gives you a plain ASCII-char-Array).
Just call file.readAll(). QString has a contructor that knows a QByteArray and if you don't use a special encoding when writing your content with QTextStream, that should do the trick.
You could also use the static public QString-functions to interpret the QByteArray received by file.readAll() in the encoding you want if you use a special encoding or a QTextStream again. -
@raspe88 is almost certainly correct. My advice is to stick to utf-8 and when saving enforce the encoding with
QString::toUtf8
, consequently when loading you convert the utf8 stream to string withQString::fromUtf8
. And never dofile.readAll().constData()
, what you do is to leaveQString
guessing what you've given it as raw byte data. Do the reading/writing consistently - if you useQTextStream
to write, then by all means, use it read the file as well. -
@raspe88 Thanks for your hint. Unfortunally, this doesn't work for me on Windows, since I have to use
stream << ui->textEdit_Report->toHtml();
in order to save formatted text. when reloading with
QString contents = file.readAll();
the result is still without umlauts.
-
As I said, you should rather use:
QByteArray data = ui->textEdit_Report->toHtml().toUtf8(); file.write(data);
and for reading:
QString contents = QString::fromUtf8(file.readAll());
-
@kshegunov said in QTextEdit does not display german Umlauts (öÖüÜäÄß) after loading a textfile:
QString contents = QString::fromUtf8(file.readAll());
PERFECT! This solves my issu. Thanks a lot! :)
-
You're welcome.
Btw, Mrs. Onan is rather plump, isn't she? :D -
@kshegunov Thanks, man. This was the solution. Works like a charm now. I guess I should dive deeper into Qt encoding and file operations ;)
-
@mbergmann-sh said in QTextEdit does not display german Umlauts (öÖüÜäÄß) after loading a textfile:
I guess I should dive deeper into Qt encoding and file operations
Qt's documentation is pretty good, so that's a good place to start.
-
@kshegunov oh yes, she is :D
-
Another thing...
(this, trUtf8("Datei öffnen"), "",
Be careful using anything other than 7-bit ASCII for your source files as not all compilers might support that.