Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Mein Ziel ist es eine Zeile, die Teile japanischer Schrift beinhaltet, korrekt auszulesen, doch meinem BufferedReader gelingt es aus mir unerklärlichen Gründen nicht und gibt nur Wirrnis aus.
Mittels welchen Wegs ist dieses zu bewerkstelligen?
Du musst die genaue Bezeichnung des Zeichensatzes kennen, den der Text verwendet, und z.B. einem InputStreamReader bei Konstruktion mitteilen. Der Zeichensatz könnte ein "spezieller" wie Shift_JIS sein, kann aber auch ein Unicode-Zeichensatz sein. Dass nur Wirrwarr herauskommt, liegt wahrscheinlich daran, dass der (Standard-)Zeichensatz nicht einmal im Ansatz zum zu verwendenen kompatibel ist.
先生が新設に教えてくださるのでわたし日本語もかなりじょうずになりました。§Sensei=ga sinsetsu=ni osie.te kudasar.u=no=de watashi=no nihon.go=mo kanari zyoozu=ni nari.masi.ta.§Da mein Lehrer mir so netten Unterricht erteilt, ist auch mein Japanisch ziemlich gut geworden.
Das ist allerdings möglich, dass die NetBeans "Konsole" kein Unicode unterstützt. Zudem ist in dem Quelltext noch ein ArrayIndexOutOfBoundsException, weshalb es wohl auch nicht auf dem GUI angezeigt wird.
//Nachtrag:
Die ArrayIndexOutOfBoundsException wird allen Anschein nach von den jap. Zeichen ausgelöst. Ein Versuch mit lateinischen Zeichen hat das bestätigt.
Leider funktioniert deine Lösung auch nicht, Ark.
//Zweiter Nachtrag:
Scheinbar zählt das JRE bei zwei echten Zeilen drei.
Das ist allerdings möglich, dass die NetBeans "Konsole" kein Unicode unterstützt. Zudem ist in dem Quelltext noch ein ArrayIndexOutOfBoundsException, weshalb es wohl auch nicht auf dem GUI angezeigt wird.
1. Die Netbeans Konsole unterstützt sicherlich keine Japanischen Zeichen
2. Die JRE zählt keine Zeichen
3. Ein Unicode Character passt nicht immer in ein char.
Es könnte auch sein, dass ich einen völlig falschen Ansatz habe. Könnte jemand etwas so geartetes programmieren, dass funktionierend jap. Zeichen liest und in einem GUI darstellt, welches ich dann auf meinem System ausprobiere?
Nimm einen BufferedReader und einen BufferedWriter.
Lies die Datei und schreib den String anschließend in eine andere Datei.
Wenn beide identisch sind hast du das richtige Encoding verwendet.
So weit ich das überblicke, scheinen alle verwendeten Zeichen Codes <=0xFFFF zu benötigen, es wird also reichen.
Ark
EDIT: Zu Wildcard's Vorschlag noch: Führe dann aber besser nach jedem Schreibvorgang ein flush() aus, damit wir dann keine leere Datei bewundern müssen, wenn der Fehler kommt.
Interessant... Es scheint, als können die Buffered-Routinen mit Unicode umgehen, selbst mit übergebenen FileReader, also ohne expliziter Zeichensatznennung.
Doch wo ist nun der Fehler?
Dass das Lesen und Schreiben funktionieren, liegt ja auch ganz einfach daran, dass die Zeichensätze beim Lesen und Schreiben übereinstimmen. Du hättest genausogut auch byteweise die Datei kopieren können, das hätte den gleichen Effekt. Nur ist damit noch nicht gesagt, dass die Bytes von den Readern/Writern auch richtig interpretiert wurden (also sie den Bytefolgen die richtigen Zeichen zugeordnet haben).
Wenn du die Zeichen korrekt ausgeben willst, musst du schon den richtigen Zeichensatz einstellen und dann auch eine Ausgabe verwenden, die mit japanischen Text umgehen kann. Nimm doch einfach eine JTextArea und weise ihr den Text zu, dann sollten wir mehr sehen (oder auch nicht).
Der Fehler mit den Arraygrenzen hat aber nichts damit zu tun (meine Vermutung).
Dass das Lesen und Schreiben funktionieren, liegt ja auch ganz einfach daran, dass die Zeichensätze beim Lesen und Schreiben übereinstimmen. Du hättest genausogut auch byteweise die Datei kopieren können, das hätte den gleichen Effekt. Nur ist damit noch nicht gesagt, dass die Bytes von den Readern/Writern auch richtig interpretiert wurden (also sie den Bytefolgen die richtigen Zeichen zugeordnet haben).
Nein, das stimmt nicht. Wenn du Reader/Writer verwendest konvertierst du in Java Strings wenn danach noch alles passt, war das Encoding in Ordnung und der String kam sauber an. Der Fehler liegt also an anderer Stelle.
Ah, Ich sehe schon... Die allgemeine Nettiquette im java-forum tritt einmal mehr zutage.
Tja, dann stimmt wohl der Eingangszeichensatz nicht. Kennst du den Zeichensatz des Textes bzw. hast du Einfluss auf ihn?
Und was ist mit dem Arraygrenzenfehler? Da wir momentan wohl zwei Fehler behandeln, wäre es besser, wenn du jedes Mal sagen würdest, welcher der Fehler noch immer auftritt.
Nein, das stimmt nicht. Wenn du Reader/Writer verwendest konvertierst du in Java Strings wenn danach noch alles passt, war das Encoding in Ordnung und der String kam sauber an. Der Fehler liegt also an anderer Stelle.
Wann ist "danach"? Dass die Strings nach Einlesen mit falschem Zeichensatz ziemlichen Müll enthalten, ist mir schon klar, aber wenn genau dieser Müll mit genau dem gleichen Zeichensatz wieder herausgeschrieben wird (z.B. in eine Datei), dann entsteht auch ein identischer Bytestrom.
Ich habe den Text selbst verfasst und Unicode-codiert als Textdokument gespeichert. Hier kannst du es dir selbst anschauen: Saetze.txt
Und was ist mit dem Arraygrenzenfehler? Da wir momentan wohl zwei Fehler behandeln, wäre es besser, wenn du jedes Mal sagen würdest, welcher der Fehler noch immer auftritt.
Wann ist "danach"? Dass die Strings nach Einlesen mit falschem Zeichensatz ziemlichen Müll enthalten, ist mir schon klar, aber wenn genau dieser Müll mit genau dem gleichen Zeichensatz wieder herausgeschrieben wird (z.B. in eine Datei), dann entsteht auch ein identischer Bytestrom.
Ach, ist das so? Dann schreib mal eine binärdatei mit einer BufferedReader/Writer Kombination.
Wenn das Ding korrekt auf einen Java String gemappt werden kann, und es anschließend richtig wieder raus kommt, ist es sehr wahrscheinlich das richtige Encoding (oder Glück).
Die Datei ist in UTF-16LE kodiert. Bitte verwende diesen Zeichensatz (und teste dann mit Swing).
Ark
@Wildcard: Warum sollte es nicht funktionieren, wenn ich immer jeweils als Ein- und Ausgabekodierung ISO-8859-1 verwende? Die Strings sind u.U. Schrott, genauso wie die Bytes, wollte man die einzelnen chars mit &0xFF casten. Aber nur zum Rein- und Wiederrausschreiben sollte es funktionieren.
UTF-Zeichensätze sind Unicode-Zeichensätze (Wikipedia hilft ). Dass es ausgerechnet UTF-16LE sein sollte, hat Firefox entweder vermutet oder herausgelesen (an einer BOM, Byte Order Mark, auch hier hilft Wikipedia ). Jedenfalls werden mir die Hiragana usw. korrekt wiedergegeben.
"Unicode" als Bezeichnung für einen Zeichensatz ist leider nicht eindeutig. Im Wikipediaartikel über UTF-8 (u.a.) sollten auch andere Unicode-Zeichensätze genannt sein.
@Wildcard: Warum sollte es nicht funktionieren, wenn ich immer jeweils als Ein- und Ausgabekodierung ISO-8859-1 verwende? Die Strings sind u.U. Schrott, genauso wie die Bytes, wollte man die einzelnen chars mit &0xFF casten. Aber nur zum Rein- und Wiederrausschreiben sollte es funktionieren.
@Ikaragua: Mir ist gerade spontan beim Lesen aufgefallen, dass es an einer Stelle というきせい (to i u ki se i) heißt, während in der Umschrift "to yuu kisei" geschrieben wird, was ich spontan in とゆうきせい transkribiert hätte. Was stimmt denn nun? oO
@Ikaragua: Mir ist gerade spontan beim Lesen aufgefallen, dass es an einer Stelle というきせい (to i u ki se i) heißt, während in der Umschrift "to yuu kisei" geschrieben wird, was ich spontan in とゆうきせい transkribiert hätte. Was stimmt denn nun? oO