Variable Unicodes

public static void main(String[] args) {
    System.out.println("Unicodes:");
    for (int i = 0; i <= 0xFFFF; i++) {
        String unicode = "\u";
        String hex = Integer.toHexString(i);
        if (hex.length() < 4) {
            int leng = 4 - hex.length();
            for (int j = 0; j < leng; j++) {
                hex = "0" + hex;
            }
        }
        unicode += hex;
        System.out.println("Die Zahl " + i + " ist in Hex " + hex + " und der Unicode dazu ist: " + unicode);
    }
}

Wieso geht das nicht? Krieg immer den Fehler, dass das eine illegale Deklaration von unicodes ist, aber ich wollte im prinzip mir nur mal alle Unicodes anzeigen lassen. Wie soll ich das sonst machen, anstatt alle per Hand hinzuschreiben?

so wie du den String zusammenbauen willst, explizit mit „0“+, wäre es doch ein String aus mehreren Zeichen, maximal käme irgendwas wie „uF545“ heraus,
warum sollte das als ein Zeichen angezeigt werden?

\u ist letztlich eine Compiler-Magie, „interpretiere die folgenden Zahlen im Quellcode als …“,
das kann man im Code nicht nachbauen und muss man zum Glück auch nicht:

char c = (char) intWert; 

tut es ausreichend, im ASCII-Bereich am Anfang wie bis zum char-Höchstwert


im übrigen Suchmaschine ‚java int unicode‘ und ähnliches ebenso :wink:

Siehe hier: Chapter 3. Lexical Structure und hier: Compiler Design - Phases of Compiler - Tutorialspoint - JLS sagt nicht viel aus, wie dieser Schritt genau heißt, aber ich würd sagen: Das passiert während der Lexical Analysis und ist vielleicht eine bestimmte Ersetzung. Vielleicht vergleichbar mit C/C++ et al. und Präprozessordirektiven - bevor überhaupt die LA anläuft, wird ersetzt usw.


Jetzt nochmal zu deinem Problem… Du müsstest im Java-Programm deinen String als ein Java-Programm interpretieren, compilieren und starten… Wie das geht, das steht hier: http://stackoverflow.com/questions/23663547/compile-java-source-from-string-without-writing-to-file - Vorher müsstest du verhindern, dass das Unicodezeichen im String von dem Hüllprogramm interpretiert wird :wink: .

Die vordergründige Antwort ist: Nach dem \u erwartet er weitere Zeichen, sonst ist das eben “ungültig”. (Man könnte auf den Gedanken kommen, mit \\u den backslash zu escapen, aber das sollte nicht nötig sein - was SlaterB gesagt hat, sollte im Prinzip funktionieren)

Slaters Antwort war zu einfach für mich… Da bin ich nicht drauf gekommen, aber warum das so nicht geht macht Sinn. Hat auch geklappt so

Ich hab zu einfach gedacht,

  • Einmal escapet, wird nicht mehr interpretiert
  • Ein nicht escapet \ fordert einen gültigen Unicode
  • Das gilt auch in Kommentaren… (damit ist klar(!): Ersetzung während LA):
        System.out.println("\u0061"); // a
        System.out.println("\\" + "u" + "0061"); // \u0061
        // /* z. B.: */ System.out.println("\u006" + "1"); // illegal unicode escape
  • Für den Kommentar in Zeile 2 gilt das auch!! (Er wird akzeptiert, da richtig und vollständig)

  • Ich bin mir nicht sicher, ob man "\\u0061" in einem Java-Programm nochmal so übersetzen/compilieren könnte, dass beim zweiten Mal der String als Unicode interpretiert wird…
  • Es wäre jedenfalls sehr kompliziert und aufwändig