Russische UND lateinische Buchstaben

White_Fox

Top Contributor
Moin Leute

Ich will in einem Program sowohl latainische als auch kyrillische Buchstaben aus-, eingeben und verarbeiten können, scheitere aber an den kyrillischen. Diese werden nur als ? angezeigt (sowohl in der GUI als auch in der Konsole). Ich meine zwar, ich hätte das Codierungsproblem in meinem anderen Projekt schonmal gelöst (da ging es um die deutschen Umlaute, russische Buchstaben funktionieren dort aber auch zumindest in der GUI, nicht aber auf der Konsole), aber ich komme absolut nicht drauf wie ich das zu machen hätte. Ich bin mir auch relativ sicher, schon einmal Привет, Мир auf der Netbeanskonsole ausgegeben zu haben, aber ich weiß nicht mehr, wie.

Einfach nur an der Konsole auf meinem eigenen Computer rumfummeln ist keine Lösung, das soll schon allgemein funktionieren. Wenn ich das richtig sehe, müßte ich in der JVM alles auf UTF-8 umstellen, aber das müßte schon passieren bevor meine main-Methode aufgerufen wird. Wie machen? Ich habe das Projekt auf Java 21 gezogen (irgendwann ab 20 soll UTF-8 allgemeiner Standard sein, habe ich jedenfalls irgendwo gelesen), aber das hat nix gebracht.

Ich will die russischen Zeichen auch verarbeiten können, es wäre schön wenn ich das direkt im Code tun könnte, so daß ich auch lesen kann was da gemacht werden soll, und nicht erst aus UTF-8 dekodieren muß.

Habt ihr eine Idee?
 

KonradN

Super-Moderator
Mitarbeiter
Generell ist das Encoding wichtig und zwar an allen Stellen:

a) Wo kommen die Zeichen her? Die musst Du also als UTF-8 codiert bekommen und einlesen. Also z.b. die Dateien UTF-8 codiert speichern und dann im Projekt eingestellt haben, dass diese als UTF-8 gelesen werden.
b) Bei der Ausgabe - da verwendet Java ab Java 20 UTF-8. Das Default Encoding kannst Du auch ausgeben lassen: Charset.defaultCharset().name() ausgeben.
c) Das System, dass die Ausgabe anzeigen soll, muss dies natürlich auch unterstützen.

Das Default Encoding könntest Du direkt als erstes in der main Methode setzen. System.setProperty("file.encoding","UTF-8"); Das wird zwar gehen, aber das ist eher unüblich und verhindert z.B. das setzen des Encodings von außen per -Dfile.encoding=....


Ggf. einfach einmal genau zeigen, was Du genau machst. Dann kann man ggf. besser helfen. Um zu sehen, on es an a) b) oder c) liegt, kann man natürlich gewisse Dinge machen. Du kannst den Text z.B. in eine Datei schreiben und dann siehst Du, ob das encoding richtig ist. Oder Du schaust dir das Zeichen direkt an um zu sehen, was es für ein Wert hat (Intern nutzt Java aber UTF-16! Das nicht vergessen! Nicht dass Du ein Zeichen hast, dass UTF-8 und UTF-16 unterschiedlich codiert ist und Du Dich dann über falsche Werte wunderst!)

Das wären so die allgemeinen Dinge, die mir da so auf Anhieb einfallen.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn es speziell um System.out geht: Evtl. kann man das auch neu setzen mit etwas wie System.setOut(new PrintStream(System.out, true, "UTF-8")); - aber das habe ich noch nie gemacht. Keine Ahnung, ob sowas funktionieren kann oder nicht :)
 

KonradN

Super-Moderator
Mitarbeiter
Ausschließlich Tastatureingabe.
Das ist dann leider ein Bereich, in dem ich bisher keine Erfahrungen habe. Wie werden Tasteneingaben an die Anwendung gegeben?

Es geht rein um Windows oder läuft es auch auf anderen Systemen? Denn meine Idee ist gerade, da einmal zu schauen, was eine Anwendung genau von Windows bekommt und da dürfte ja ein Blick auf das entsprechende Event reichen, das die Anwendung bekommt. Das sollte man hoffentlich auf msdn finden können.

Aber ob das wirklich zielführend ist, weiss ich nicht.
 

White_Fox

Top Contributor
Haha....das ist mal wieder so typisch (für mich). Da wollte ich eigentlich nur ein relativ einfaches Programm schreiben, und dann sagen mir die Profis "Hab ich so auch noch nicht gemacht".

Also: Eigentlich will ich nur eine GUI-Bibliothek testen. Die GUI ist fertig. Das Programm selber soll ein Trainer sein, um das Zehn-Finger-System zu trainieren. Zehn-Finger-Tippen auf deutschem Tastaturlayout kann ich, aber halt nicht auf russisch...dem wollte ich damit abhelfen.

Außer ein paar (deutsch beschrifteten) Checkboxen und Slidern für Trainingseinstellungen will ich nur ein Label anzeigen auf dem steht, was zu tippen ist. Wird das erste Zeichen dieses Strings eingetippt, wird das erste Zeichen entfernt und der String nachgezogen. Die Tastatureingaben wollte ich direkt aus System einlesen. Russisches Tastaturayout will ich vorher einstellen, man kann mehrere Tastaturlayouts unter Windows fix mit Shift+Alt durchschalten. Das griechische Tastaturlayout habe ich deshalb schon seit Jahren parallel installiert, weil man doch gerne mal Zeichen wie Ω, φ, π, ρ, λ, ω,... verwendet.

Edit:
Sowohl System.setProperty("file.encoding","UTF-8"); als auch System.setOut(new PrintStream(System.out, true, "UTF-8")); bringen leider nichts, auch nicht in der Konsolenausgabe.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Die Frage ist erst einmal: Gibt es ein Problem? Wenn ja, dann müsste man es genauer Lokalisieren.

Mach einfach einmal eine Swing Anwendung mit einem Textfeld: Kannst Du da alle Zeichen so eingeben, wie Du es gerne hättest? Sprich: Du schaltest die Tastatur-Belegung um und schon schreibst Du die gewünschten Zeichen richtig?

Dann würde es bei der Eingabe keine Probleme geben bei dem, was Java bekommt.

Bei einer Konsolen-Anwendung würde ich dann die Konsole prüfen: Kannst DU in der Eingabeaufforderung (oder was Du auch immer nutzt) die Zeichen frei schreiben? Also Tastatur-Belegung umschalten und immer kommt, was Du genau willst?

Wenn das funktioniert, dann kann man das mit der Eingabe probieren. Dazu einfach ein kleines Programm, dass z.B. per Scanner Zeilen einliest und diese direkt wieder ausgibt.
Das kannst Du dann mit -Dfile.encoding=UTF8 starten. Klappt das auch noch?

An welcher Stelle kommen welche Probleme?
 

Robert Zenz

Top Contributor
Also wenn der String aus Swing/JavaFX/GUI kommt, dann wuerde ich mal davon ausgehen dass dieser ein gueltiger UTF-16 Text ist, also die Zeichen korrekt enthaelt so wie sie der Benutzer eingegeben hat. Wenn nicht haettest du naemlich ganz schlechte Karten das zu korrigieren.

Ich will in einem Program sowohl latainische als auch kyrillische Buchstaben aus-, eingeben und verarbeiten können, scheitere aber an den kyrillischen. Diese werden nur als ? angezeigt (sowohl in der GUI als auch in der Konsole).
Auf der Konsole koennte ich noch verstehen, auf der Oberflaeche wird es aber ominoeser. Alternativ koennte es auch sein dass deine Schriftart die Zeichen nicht kann. Das wuerde aber eigentlich nur die GUI erklaeren.

Ansonsten das was Konrad schon sagt, testen ab wo die Zeichen falsch sein um einzugrenzen wo genau das Problem besteht.
 

White_Fox

Top Contributor
Also wenn der String aus Swing/JavaFX/GUI
Nee...das ist weder Swing noch JavaFX, sondern eine C++-Bibliothek mit Javawrapper.
In der GUI habe ich tatsächlich gar kein Eingabefeld. Da wollte ich einfach den Standardinput nehmen, aber ohne die Eingabe anzuzeigen.

Auf der Konsole koennte ich noch verstehen, auf der Oberflaeche wird es aber ominoeser. Alternativ koennte es auch sein dass deine Schriftart die Zeichen nicht kann. Das wuerde aber eigentlich nur die GUI erklaeren.
Die GUI muß, soweit ich weiß, eine spezielle Schriftart laden, Fragezeichen in der GUI wären mir jetzt auch erstmal logisch gewesen. Deshalb wollte ich das mit der Konsole prüfen, ob die auch Zeichen außerhalb des ASCII-Bereichs korrekt anzeigt.

Ansonsten das was Konrad schon sagt, testen ab wo die Zeichen falsch sein um einzugrenzen wo genau das Problem besteht.
Tja, das ist es gerade: Ich habe nicht viel einzugrenzen. Ich mache ja eigentlich noch nix.

Ich habe eine Methode, die einen String liefert und die von der GUI aufgerufen wird um den String anzuzeigen. Schreibe ich die Methode wie folgt:
Java:
String textToType() {
    System.out.println("Привет, Мир  äöü");
    return "Привет, Мир äöü";
}
Dann zeigt mir die GUI nur ? an, aber die Konsole immerhin äöü mit lauter ? davor.

Formuliere ich die Methode aber als:
Java:
String textToType() {
    System.out.println(new String("Привет, Мир  äöü".getBytes(), StandardCharsets.UTF_8));
    //return "Привет, Мир äöü";
    return new String("Привет, Мир  äöü".getBytes(), StandardCharsets.UTF_8);
}
werden mir auch in der Konsole nur Fragezeichen angezeigt. Mit oder ohne ystem.setProperty("file.encoding", "UTF-8"); in der Maimethode vorher.
 

Robert Zenz

Top Contributor
Wsa du noch pruefen solltest ist in welcher Enkodierung dein Editor die Quellcodedateien ablegt, und welche Enkodierung dein Compiler fuer die Quellcodedateien erwartet. Das kann schon abweichen und hier zu Verwirrung fuehren.

Nee...das ist weder Swing noch JavaFX, sondern eine C++-Bibliothek mit Javawrapper.
Ist ein moegliches Problem, aber glaube ich gerade nicht.
 

White_Fox

Top Contributor
Bei einer Konsolen-Anwendung würde ich dann die Konsole prüfen: Kannst DU in der Eingabeaufforderung (oder was Du auch immer nutzt) die Zeichen frei schreiben? Also Tastatur-Belegung umschalten und immer kommt, was Du genau willst?
Ja, das funktioniert. Ein einfaches
Java:
Scanner scanner = new Scanner(System.in);
do {           
    String s = scanner.nextLine();
    System.out.println(s);
}while (true);
am Anfang der Mainmethode macht genau, was es soll. Auch mit Umschalten, während das Programm läuft.

Dann werde ich jetzt mal die Eingabe einbauen...und dann mal schauen.
 

KonradN

Super-Moderator
Mitarbeiter
Da ist maximal zu prüfen, wie denn C++ den String behandelt. Das dürfte dann ja ein std::string sein oder wurde da was anderes verwendet wie char * oder falls es nicht urf8 ist, dann u16string / u32string bzw. char16_t / char32_t. Microsoft bietet da teilweise auch andere Typen wie CString bei MFC oder std::wstring … BSTR bei COM meine ich in TCHAR fallen mir noch ein)

Und das muss dann beim Übergang richtig behandelt werden. Das kann man also auch etwas im Detail betrachten.
 

White_Fox

Top Contributor
Ich habe eben mal die Quelldateien geprüft. Alle waren in UTF-8-Kodierung, außer die in der ich mit russischen Zeichen herumschreibe. Da zeigt mir Notepad++ als Kodierung Windows-1255 an.

Ich habe die Datei auf UTF-8 umgestellt, nun werden mir die ? auch im Quellcode angezeigt. Liegt das am Eingabestream?
 

KonradN

Super-Moderator
Mitarbeiter
Die Datei hat eine Kodierung. Und die muss bei allen Source Dateien UTF8 sein wenn das so von Java verlangt wird.

Du darfst die Kodierung in Notepad++ nicht einfach umstellen sondern die Kodierung umwandeln, Dann bleiben die Zeichen gleich und du kannst es einfach speichern. Danach sollten die Zeichen auch richtig angezeigt werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T xls-Datei per Apache Commons CsvParser einlesen UTF-8 Zeichen russische Zeichen Allgemeine Java-Themen 2
kodela Gemittelte Ausgabe von Buchstaben Allgemeine Java-Themen 11
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
parrot Gleiche Buchstaben Aufage Allgemeine Java-Themen 40
F In String 2 Buchstaben vertauschen Allgemeine Java-Themen 2
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
Tacofan Hangman so viele Labels wie Buchstaben Allgemeine Java-Themen 5
L Menge der Buchstaben eines Textes zählen Allgemeine Java-Themen 3
KaffeeFan Methoden replace alle Buchstaben Allgemeine Java-Themen 3
P Methoden Häufigkeistverteilung von Buchstaben Allgemeine Java-Themen 2
I Eclipse API zur Buchstaben/Zeichensatzumwandlung Allgemeine Java-Themen 1
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3
J Doppelte Buchstaben löschen - letztes Wort macht er nicht Allgemeine Java-Themen 2
S Char-index aller Buchstaben..? Allgemeine Java-Themen 3
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
C Buchstaben, die in zwei Wörtern vorkommen Allgemeine Java-Themen 13
P Unicode-Problem: Griechische Buchstaben Allgemeine Java-Themen 11
T Logische Abfolge von buchstaben kombinationen Allgemeine Java-Themen 12
G Buchstaben in umkekehrter Reihenfolge ausgeben Allgemeine Java-Themen 4
A Wort in seine Buchstaben zerlegen Allgemeine Java-Themen 37
S Methode zum Zählen von Buchstaben in Strings gesucht Allgemeine Java-Themen 11
E Spezielle Buchstaben darstellen? Allgemeine Java-Themen 7
J Java - 4-Buchstaben-Programm. Hilfe. ich hänge fest Allgemeine Java-Themen 7
Luma Buchstaben "umrechnen" in HEX-, DEC- und BIN-Forma Allgemeine Java-Themen 2
G Methode, die Buchstaben in Zahlen umwandelt? Allgemeine Java-Themen 13
Luma String in seine Buchstaben zerlegen? Allgemeine Java-Themen 3
M Buchstaben anordnen / Wortliste Allgemeine Java-Themen 2
I Suche Methode: Buchstaben in ASCII umwandelt Allgemeine Java-Themen 2
H Kann keine Zahlen von Buchstaben unterscheiden Allgemeine Java-Themen 4
A Buchstaben zählen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben