Unicode Datei schreiben
-
Ich versuche mich gerade daran, eine tiefergestellte 1 in eine Datei zu schreiben. Mein Ansatz ist der hier:
int wmain() { wofstream os("unicode.txt"); os << L'\x2081'; os << flush; return 0; }UNICODE ist definiert, aber trotzdem bleibt die Datei leer. Wenn ich aus dem
wchareinwchar*mache, interpretiert das ProgrammL'\x2081'als'\x20. Nur habe ich keine Ahnung wieso.
-
Dieser Thread ist zwar grösstenteils Schrott, aber der letze Beitrag gibt einen guten Link an: http://www.joelonsoftware.com/articles/Unicode.html
wofstreamheisst nicht Unicode (das ist auch mitofstreammöglich), sondern nur UTF-16. Und UTF-8 (=ofstream) ist die verbreitetere Codierung.Das mit dem
wcharundwchar*musst du mir allerdings nochmal erklären.
-
Im GCC 4.5 kann ich direkt utf8 in strings schreiben und die überall benutzen.
Also cout << "Hälló Wørlð" oder eben direkt in ne Datei (z.B. via ofstream) geht alles problemlos.
No magic here.
mfg, René~
-
NewSoftzzz schrieb:
Im GCC 4.5 kann ich direkt utf8 in strings schreiben und die überall benutzen.
Also cout << "Hälló Wørlð" oder eben direkt in ne Datei (z.B. via ofstream) geht alles problemlos.
No magic here.
mfg, René~
Das ist übrigens keine Magie des GCC, sondern einfach eine fundamentale Eigenschaft von UTF-8. Den GCC Interessiert es ja nicht, was in den Stringliteralen steht, solange jedes einzelne Zeichen in einen normalen char passt.
-
unicode finde ich in C++ nicht schön, aber vielleicht versteh ichs auch einfach nich
-
SeppJ schrieb:
Das ist übrigens keine Magie des GCC, sondern einfach eine fundamentale Eigenschaft von UTF-8. Den GCC Interessiert es ja nicht, was in den Stringliteralen steht, solange jedes einzelne Zeichen in einen normalen char passt.
Eigentlich sollte es so sein aber ich weiß noch, dass ich damals in C++ keine Sonderzeichen in Strings benutzen konnte unter Windows. Das ist aber länger her und ich weiß auch nicht woran es lag.
mfg, René~
-
NewSoftzzz schrieb:
Also cout << "Hälló Wørlð" oder eben direkt in ne Datei (z.B. via ofstream) geht alles problemlos.
Das klappt bei mir auch, aber das sind ja noch alles ASCII Zeichen. Wenn ich z.B. sowas wie
cout << ₁(tiefergestellte 1) schreibe, macht das Forum genauso Probleme wie mein Programm. Visual Studio meldet zwar, dass die Datei in Unicode gespeichert wird, kompliert wird zwar auch, aber die Datei bleibt leer. Wenn ich jetzt z.B.os << L'\x2081' << "Hello World";schreibe, wird in die Datei nur das Byte 20 in die Datei geschrieben, mehr nicht.
-
Keine Ahnung schrieb:
NewSoftzzz schrieb:
Also cout << "Hälló Wørlð" oder eben direkt in ne Datei (z.B. via ofstream) geht alles problemlos.
Das klappt bei mir auch, aber das sind ja noch alles ASCII Zeichen.
Weder ä noch ó noch ø noch ð sind ASCII-Zeichen.
-
Ok, vielleicht nicht, aber sie passen immer noch in ein Byte rein.
-
Das hängt von der Kodierung ab. Ich kenne keine Kodierung, in der alle 4 Symbole in einem Byte darstellbar sind. In UTF8 ist keins der 4 in einem Byte darstellbar.
-
Keine Ahnung schrieb:
Ok, vielleicht nicht, aber sie passen immer noch in ein Byte rein.
Tun sie nicht. Dass man hier immer alles beweisen muss.
Im GCC 4.5 klappt z.B. auch folgendes:
cout << "カタカナ" << endl;mfg, René~
-
Hast du immer noch nicht verstanden, dass das nichts mit der GCC (es heisst "die GCC") zu tun hat, sondern - wenn schon - mit deiner Shell?
-
Mit der Shell auch nicht - wenn schon, mit dem Terminal.
-
SG1 schrieb:
Mit der Shell auch nicht - wenn schon, mit dem Terminal.
Hm, ich meine damals wurde mein Code nicht kompiliert mit Umlauten. Also weder Shell noch Terminal sondern entweder Compiler oder Encoding der Sourcedatei.
Was hat denn der OP für ein Problem mit dem Sondernzeichen, wenn er es direkt in einen String packt?
mfg, René~
-
NewSoftzzz schrieb:
Was hat denn der OP für ein Problem mit dem Sondernzeichen, wenn er es direkt in einen String packt?
Das die Datei einfach leer bleibt. Es wird nur bis zu dem Sonderzeichen in die Dateigeschrieben, sobald das Sonderzeichen kommt, bricht der stream ab.
-
@Op, versuch mal folgendes in die Datei zu schreiben (bitte den String genau so in die .cpp kopieren:
"abカタカナcd"
Und dann meld dich mal wieder mit dem Ergebnis
mfg, René
-
Es wird nur "ab" in die Datei geschrieben...
-
Keine Ahnung schrieb:
Es wird nur "ab" in die Datei geschrieben...
Benutz mal statt wofstream nur ofstream und melde dich wieder.
mfg, René~
-
Dann kommt eine Compilerwarnung für jedes Zeichen:
warning C4566: Das durch den universellen Zeichennamen "\u30AB" dargestellte Zeichen kann in der aktuellen Codepage (1252) nicht dargestellt werden.Die ganzen Sonderzeichen werden durch ein Fragezeichen (3F) ersetzt.
-
Hm okay, dann sind jetzt die Leute gefragt, die hier immer behaupten es liegt NICHT am Compiler. Was muss OP machen? Kenne mich mit dem Windows Compilerzeugs nicht aus

mfg, René~