# JSON export String Unicode?



## nit19969 (28. Apr 2022)

Hi, 
Ich bin auf folgendes Problem gestoßen. 
Ich habe mir eine JSON geschrieben mit Sonderzeichen und auch polnischen Alphabet. Beim einlesen funktioniert alles und wird auch in javafx fehlerfrei dargestellt. Aber beim Schreiben in eine Datei bekomme ich nur ? anstatt der Umlaute. Gibt es eine Hilfsklasse, um die Strings in utf zu convertieren oder wie mache ich das am besten


----------



## KonradN (28. Apr 2022)

nit19969 hat gesagt.:


> Hi,
> Ich bin auf folgendes Problem gestoßen.
> Ich habe mir eine JSON geschrieben mit Sonderzeichen und auch polnischen Alphabet. Beim einlesen funktioniert alles und wird auch in javafx fehlerfrei dargestellt. Aber beim Schreiben in eine Datei bekomme ich nur ? anstatt der Umlaute. Gibt es eine Hilfsklasse, um die Strings in utf zu convertieren oder wie mache ich das am besten


Ich würde vermuten, dass Du einfach ein falsches Encoding nutzt beim schreiben / lesen. Du schreibst in einem Encoding und die ? siehst Du, weil Du vermutlich versuchst, es in einem anderen Encoding zu lesen / anzuzeigen.

Wenn Du ein bestimmtes Encoding haben willst, dann musst Du dieses aktiv setzen. Also z.B. bei PrintWriter kannst Du das Charset mit angeben.


----------



## yfons123 (28. Apr 2022)

kann es sein dass dein editor einfach keine polnischen zeichen darstellen kann?

also dass ansich diese zeichen da stehen aber der editor mit dem du das öffnest rafft es einfach niccht ?


----------



## nit19969 (28. Apr 2022)

yfons123 hat gesagt.:


> kann es sein dass dein editor einfach keine polnischen zeichen darstellen kann?
> 
> also dass ansich diese zeichen da stehen aber der editor mit dem du das öffnest rafft es einfach niccht ?


Nein, daran liegt es nicht, für json nutze ich visual Studio. Die von Hand geschrieben JSON wird normal angezeigt. 
und wenn ich einen beliebigen String in ein JSONObject reingebe kommt eine Fehlermeldung.
// JSONObject uk = new JSONObject();
// uk.put("uk","Пожертвуйте гроші");


----------



## LimDul (28. Apr 2022)

CP1252 würde ich nicht als sinnvolles Encoding ansehen, in der Regel sollte man man eher auf UTF-8 setzen. 

Aber es handelt sich wie man da sieht eindeutig um ein Encoding Problem. Du musst an *jeder* Stelle - egal ob von Hand im Editor oder im Programm - sicherstellen, dass das gleiche Encoding verwendet wird.


----------



## KonradN (28. Apr 2022)

Das Problem ist also, dass Java kein UTF-8 Encoding nutzt. Da dies im Rahmen der Programmlogik auch gefordert ist, sollte man es generell im Source setzen und nicht auf den Standard vertrauen.

Du kannst es aber durchaus ausprobieren - nutze beim Aufruf einmal `-Dfile.encoding=UTF-8`, damit setzt Du das default Encoding deines Programms auf UTF-8 und die Datei wird (hoffentlich) korrekt geschrieben. (Ganz am Rande: Ab Java 18 wird das UTF-8 auch zum default encoding auf allen Plattformen!)


----------



## Robert Zenz (28. Apr 2022)

Das es wieder ein Haus und Hof Them von mir ist, hole ich etwas aus.

Wie wir alle wissen werden Dateien als Bytes gespeichert. Damit stellt sich natuerlich die Frage "Welcher Byte-WErt zwischen 0 und 255 soll das Zeichen A darstellen?". Der findige (und klugscheiszerische) Entwickler Antwortet natuerlich mit "65". Soweit so gut, aber was it mit dem Zeichen "й"? Da scheiden sich die Geister...

Also das Encoding der Datei musst du verstehen als Mapping von Byte-Wert auf Zeichen, und da sich hier immer die Geister geschieden haben, gibt es davon viele Unterschiedliche. In der Zwischenzeit hat sich die Welt weitestgehend geeinigt das UTF-8 das Encoding der Wahl ist. Es ist kompatibel mit ASCII in den Wertden von 0-128, und kann bis zu vier Byte pro Zeichen verwenden. Also "й" wird gespeichert als die Bytes "208 185", quasi "zweite Seite, dieses Zeichen". Damit kann UTF-8 fast alle Sprachen und Zeichen problemlos abbilden. Jetzt betritt Microsoft die Buehne, Microsoft verwendet seit jeher ein ISO 8859-1 Derivat, naemlich CP-1252 (auch bekannt als Windows 1252), welches zwar auch in den Bytes 0-128 kompatibel ist zu ASCII (und damit zu UTF-8), aber darueber hinaus einfach gar nichts gemein hat. Zusaetzlich kann CP-1252 nicht mal annaehernd die Menge an Zeichen abbilden wie UTF-8.

Daraus ergibt sich die tolle Situation, dass Text welcher auf Windows Maschinen geschrieben wird, und mehr als Lateinische Zeichen enthaelt, einfach Kacke zum verarbeiten ist auf allem was nicht Windows ist (auch bekannt als: Der Rest der Welt). Und genau dieses Problem hast du jetzt.

Du willst deine JSON Dateien *immer* als UTF-8 speichern (im Zweifelsfall einen Editor holen der das kann, zum Beispiel Notepad++), und du willst beim lesen und schreiben in Java *immer* explizit das `Charset` auf UTF-8 setzen (`StandardCharSets.UTF8`. Dann hast du diese Probleme nicht mehr. Und du willst auch deine IDE umstellen, so das fuer Quellcode immer UTF-8 verwendet wird, und nicht der Plattform-Standard (in deinem Fall CP-1252).


----------

