4 Stimmen

Was hat es mit dem Unicode-Zeichen 首(U+9996) auf sich und wie geht Java/Mysql mit ihm und seinen Freunden um?

Ich habe einen Java-String, der das Unicode-Zeichen U+9996 enthält (das ist, was ich erhalte, wenn ich codePointAt()) tun).

Wenn ich mir das im Debugger-Ausdruckspanel (in Eclipse) ansehe, ist alles in Ordnung und es sieht aus wie " ". Wenn ich es jedoch auf der Konsole ausdrucke, erhalte ich einfach " ? ". Die Schriftart scheint nicht das Problem zu sein, denn ich habe versucht, sie anders einzustellen.

Mein eigentliches Problem ist, dass ich versuche, die Zeichenfolge in eine MySQL-Datenbank (mit utf8-Kodierung) zu setzen. Viele andere breite Zeichen werden in der Datenbank gut angezeigt, aber auch dieses und einige andere wie es als "? All das führt mich zu der Annahme, dass das Problem auf der Java-Seite liegt.

Bei der Suche nach diesem Fehler habe ich ein wenig gelernt über Unicode-Normalisierung und java.text. Normalisierer was in diesem Fall von Bedeutung sein könnte. Ich habe gelernt, dass U+9996 die kanonische Version von U+2FB8 ist. U+2FB8 hat jedoch genau die oben genannten Probleme in Bezug auf die Anzeige, und warum sollte ich zu einer nicht-kanonischen Darstellung wechseln wollen (selbst wenn ich es könnte, was ich nicht glaube)?

Jedenfalls habe ich einen möglichen Hinweis gefunden, den ich nicht nachvollziehen kann. Diese Seite enthält die Worte "U+9996 ist kein gültiges Unicode-Zeichen", ohne weitere Erklärung. Dann wird gezeigt, wie dieses angeblich ungültige Unicode-Zeichen in verschiedenen Unicode-Kodierungen kodiert werden kann. Meine Frage ist also im Grunde folgende: WTF?


UPDATES

  • Ich arbeite mit einem Mac.
  • Ich spreche von der Eclipse-Konsole.
    • Ich habe die Konsolenkodierung unter Ausführen > Allgemein auf UTF-8 gesetzt.
    • Ich fügte hinzu -Dfile.encoding=UTF-8 zu den JVM-Argumenten (der Standard war MacRoman)
    • Die Konsole (Eclipse und Terminal.app) zeigt jetzt die richtigen Zeichen an. Hurra!
  • Ich bin vor allem daran interessiert, dass die Daten korrekt in die Datenbank gelangen, obwohl ich natürlich gerne ein umfassendes Verständnis dessen hätte, was hier vor sich geht.
  • Ich glaube, ich habe das Datenbankproblem gelöst. Ich habe vergessen, die Kodierung für die Verbindung . Jetzt verstehe ich nicht, warum einige asiatische Charaktere durchkamen und andere nicht.
  • Puh, Stackoverflow ist schnell. Es ist schwer, da mitzuhalten. Danke Leute.

0 Stimmen

U+9996 ist ein vollkommen gültiges Zeichen, es ist ein Han-Ideogramm. Siehe unicode.org/cgi-bin/GetUnihanData.pl?codepoint=9996

1 Stimmen

Wenn Sie Windows verwenden, ist die einzige Möglichkeit, Unicode-Zeichen in die Konsole zu schreiben, WriteConsoleW: msdn.microsoft.com/de-us/library/ms683458.aspx Der Java-Quellcode (OpenJDK 6) enthält keine Verweise auf WriteConsole, daher ist das Schreiben von Unicode-Zeichen in die Konsole von Java aus unmöglich.

0 Stimmen

Wie andere Poster schon sagten, ist der Char trotzdem gültig, er wird nur immer als ? auf der Konsole angezeigt.

2voto

jalf Punkte 235501

Haben Sie überprüft, ob der Wert, der in der Datenbank gespeichert wird, tatsächlich U+003f (Fragezeichen) ist? Es gibt alle möglichen Konventionen für die Anzeige von Zeichen, die in der gewählten Schriftart nicht vorhanden sind, und die Anzeige als ?' ist ziemlich üblich.

Höchstwahrscheinlich wird das Zeichen korrekt gespeichert und, aus welchen Gründen auch immer, einfach als '?' angezeigt. Ignorieren Sie im Grunde, wie es dargestellt wird, und schauen Sie sich an, welcher Codepunkt in der Datenbank gespeichert wird. Ist es U+9996 oder U+003f (oder etwas ganz anderes)? Gehen Sie nicht blind davon aus, dass es sich um ein Fragezeichen handelt, das in der Datenbank gespeichert ist, nur weil es als Fragezeichen dargestellt wird.

0voto

Joachim Sauer Punkte 290477

Ich weiß nicht, ob es Probleme gibt, aber es ist definitiv ein gültiges Unicode-Zeichen (und das schon seit Unicode 1.1).

0voto

Alnitak Punkte 324207
  1. Unter welchem Betriebssystem läuft das Programm?
  2. Welche Konsolenanwendung ist d.h. (xterm, cmd.exe, etc?)
  3. Ist die Konsolenanwendung auf UTF-8-Ausgabe eingestellt?

In Bezug auf Punkt 3, der wahrscheinlich der wichtigste ist, habe ich ähnliche Probleme bei der Verwendung von z. B. PuTTY für die Kommunikation mit einem Linux-Rechner erlebt, bei denen der Linux-Rechner dachte, ich würde UTF-8 verwenden, aber die PuTTY-Sitzung selbst war auf ISO-Latin-1 (8859-1) eingestellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X