Chinesische Schriftzeichen in Datei schreiben

Alles rund um die Programmierung mit Qt
Antworten
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Chinesische Schriftzeichen in Datei schreiben

Beitrag von KartoffelKiffer »

Hallo,

ich habe mich schon durch die Dokumentation und sämtliche Beispiele gewälzt, komme aber einfach auf keinen grünen Zweig mit der Sache.

Ich habe die Vorgabe eines Chinesen, wie ein Text-Output auszusehen hat. Dieser ist versehen mit einer chinesischen Überschrift.

Zurzeit probiere ich es mit den ersten zwei Zeichen "品" und "番".

Der aktuelle Entwicklungsschritt sieht wie folgt aus

Code: Alles auswählen

	//QByteArray ba = "品番"; // 品 = E5 93 81 & 番 = E7 95 AA

	static const QChar unicode[] = {
			  0xE59381, 0xE795AA };
	
	int size = sizeof(unicode) / sizeof(QChar); // Every 0x.... is one sign

	QString string = QString::fromRawData(unicode, size);

	QFile f("c:/test.txt");
	if (f.open(QIODevice::WriteOnly | QIODevice::Truncate))
	{
		QTextStream out(&f);
		out.setCodec("UTF-8");
		out.setLocale(QLocale(QLocale::Chinese, QLocale::China));
		out << string;
	}
	f.close();
Wenn ich ein Textdokument mit einem unicode-fähigen Texteditor öffne und das Zeichen 品 einfüge, so sehe ich im Hex-Editor die Bytes E5 93 81.

Nicht dass ich einen grundsätzlichen Denkfehler habe, aber so sollte es doch eigentlich funktionieren. Ich beschreibe das Zeichen mit 0xE59381 und erwarte im Output das chinesische Zeichen 品. Doch im Text-Output ist für die zwei Zeichen folgendes zu sehen: E9 8E 81 E9 96 AA, was zwei anderen chinesischen Zeichen entspricht, als gewünscht.

Ich habe nun schon so viel mit Konvertierungen versucht, dass mir schon schlecht wird. Entweder hapert es an dem Grundverständnis oder ich habe es falsch aufgesetzt.

Hoffentlich kann mir jemand weiterhelfen, denn ich finde irgendwie zu keiner brauchbaren Lösung.

Ich arbeite mit Qt 4.7.3, Visual Studio 2008 und Windows XP.


Grüße,
KK
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von Christian81 »

0xE59381 ist definitiv nicht der Unicode für "品" sondern UTF-8: http://vazor.com/unicode/c54C1.html Ich schätze mal mit dem anderen Zeichen ist es das Gleiche...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von KartoffelKiffer »

Hallo christian,

vielen Dank schon mal für den Hinweis!

Jetzt habe ich es fast schon wie gewünscht unter UTF-16 laufen.

Code: Alles auswählen

	const ushort* ms = L"総合判定";
// oder const ushort* ms = L"\u....";

	QFile f("c:/test.txt");
	if (f.open(QIODevice::WriteOnly | QIODevice::Truncate))
	{
		QTextStream out(&f);
		out.setCodec("UTF-16BE");
		out << QString::fromUtf16(ms, 4);
	}
	f.close();
Allerdings benötige ich noch etwas Hilfe, um das Beispiel in UTF-8 umzusetzen.

"Einfach" die Funktion auf fromUtf8, den Codes umstellen und den Datentypen ändern hat bloß die Wirkung erzielt, dass in der Datei vier Fragezeichen gelandet sind.

Normalerweise sollte es so schon ausreichen, nur können UTF-16-Zeichen z.B. nicht einfach so unter Ubuntu gelesen werden, weshalb ich gerne UTF-8 nutzen würde.


Grüße,
KK
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von Christian81 »

Frei aus dem Kopf würde ich sagen so:

Code: Alles auswählen

#include <QtGui>

int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  const char *utf8 = "\xe5\x93\x81";
  QString str = QString::fromUtf8(utf8);
  QLabel *lbl = new QLabel;
  lbl->setText(str);
  lbl->show();
  QFile f("tmp.txt");
  f.open(QIODevice::WriteOnly);
  f.write(str.toUtf8());
  // oder
  QTextStream ts(&f);
  ts.setCodec("UTF-8");
  ts << str;
  f.close();

  return app.exec();
}
Und das Ubuntu kein UTF-16 darstellen kann halte ich für ein Gerücht. Du hast sicher nur die BOM vergessen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von KartoffelKiffer »

Hallo christian,

vielen Dank für die Hilfe, das Beispiel läuft einwandfrei.

Wie sehe es eigentlich aus, wenn ich anstelle der drei Bytes "\xe5\x93\x81" gleich das Zeichen 品 in den Quelltext schreiben möchte?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von Christian81 »

QString::fromUtf8()
Dabei muss aber Dein Compiler UTF-8 beherschen (was der gcc kann) und m.E. auch dort wo es ausführt UTF-8 eingestellt sein. Sinnvoll ist es aber nicht da es, sobald irgendwo nicht UTF-8 ist, alles zerstört wird.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von KartoffelKiffer »

Ich arbeite mit Visual Studio 2008 und habe den UNICODE-Makro in den Einstellungen gesetzt.

Die cpp-Datei habe ich mittels Hex-Editor überprüft und sehe die drei Byte für jedes chinesische Zeichen. Auch werden sie mir in der Entwicklungsumgebung richtig angezeigt.

Der Export in die Datei schreibt allerdings bloß ??? in die Datei. Also auch im Hex-Editor stehen die Zeichen 3F3F(...).

Code: Alles auswählen

	// UTF-8
	const char *utf8 = "dies ist ein test: \xe7\xb7\x8f\xe5\x90\x88\xe5\x88\xa4\xe5\xae\x9a";
	QString str = QString::fromUtf8("総合判定");
	QFile f("c:/test.txt");
	if (f.open(QIODevice::WriteOnly | QIODevice::Truncate))
	{
		QTextStream out(&f);
		out.setCodec("UTF-8");
		out.setLocale(QLocale(QLocale::Chinese, QLocale::China));
		out << str;
	}
	f.close();
Läuft dieses Beispiel denn bei dir?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Chinesische Schriftzeichen in Datei schreiben

Beitrag von Christian81 »

Das hat definitiv nichts mit dem UNICODE-Macro zu tun.
Unter Windows kann der Compiler wahrscheinlich UTF-8 aber dein Codec, unter dem das Programm ausgeführt wird, ist es definitiv nicht. Windows eben.
Für so etwas gibt es ts-Dateien
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten