Jshell unter Windows: Unicode-Zeichen werden als Fragezeichen ausgegeben

robinkognito

Mitglied
Hey, folgendes Problem:

Ich bin gerade an der Programmierung eines Schachspiels und möchte dieses vorerst textuell ausgeben, bevor ich mich um das Frontend kümmere. Dafür wollte ich entsprechende Unicode-Zeichen wie z.B. ♕ nutzen.

Wenn ich das Spiel in der Jshell ausgeben möchte, erhalte ich allerdings nur Fragezeichen.

Leider komme ich beim Finden des Problems einfach nicht mehr weiter:

  • Meine Konsole (PowerShell) kann das Zeichen darstellen
Code:
PS C:\Users\PC\.vscode\Workspace\Uni\Prog2> Write-Host "♛"
♛

  • Die Kodierung in der Shell ist korrekt
Java:
jshell> System.getProperty("file.encoding")
$1 ==> "UTF-8"

  • Verschiedene Eingabeformen erzeugen das selbe, nicht erwünschte Ergebnis
Code:
jshell> game.getTypeSymbol(FigureType.BLACK_QUEEN);
$143 ==> '?'

jshell> System.out.println("♔");
?

jshell> System.out.println("\u2654")
?

Hat hier jemand eine Ahnung, was die Ursache sein könnte und wie ich das behebe?
 
Das Problem wird das Poweshell Fenster / die Eingabeaufforderung sein. Da ist eine sogenannte Codepage eingestellt, die nur bestimmte Zeichen hat.

Du musst also eine Codepage einstellen, die diese Zeichen kennt. Umstellen kannst du die Codepage mittels chcp

Probier mal
chcp 65001
Um die utf 8 Codepage einzustellen.
 
Das Problem wird das Poweshell Fenster / die Eingabeaufforderung sein. Da ist eine sogenannte Codepage eingestellt, die nur bestimmte Zeichen hat.

Du musst also eine Codepage einstellen, die diese Zeichen kennt. Umstellen kannst du die Codepage mittels chcp

Probier mal
chcp 65001
Um die utf 8 Codepage einzustellen.

Funktioniert leider weiterhin nicht, obwohl die Symbole in Unicode kodiert sind.

Code:
PS C:\Users\PC\.vscode\Workspace\Uni\Prog2> chcp 65001
Aktive Codepage: 65001.

Java:
jshell> System.out.println("♕ ♖ ♗ ♘")
? ? ? ?

jshell> System.out.println("\u2654")
?
 
Ich habe mal mein Windows 11 System hochgefahren (Ich nutze halt sonst in erster Linie einen Mac):
Das Problem kann ich nachvollziehen.

Das ist ein Problem von JShell - ich habe mal einfach ein kleines Test Programm geschrieben:
Java:
public class Test {
  public static void main(String[] args) {
    System.out.println("\u2654");
  }
}

und ein einfaches java Test.java (*) hat die richtige Ausgabe gebracht während bei JShell immer das ? angezeigt wurde.

Ein möglicher Workaround könnte ein eigener Writer sein:
Java:
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

OutputStreamWriter writer = new OutputStreamWriter(System.out, StandardCharsets.UTF_8);
writer.write("\u2654\n");
writer.flush();

Das zeigt bei meinen Tests das Symbol ebenfalls richtig an.

Was Du also brauchst, ist die Erzeugung der writer Instanz. Diese nutzt Du dann anschließend statt System.out. Den flush() Aufruf solltest Du machen, wenn die Ausgaben soweit fertig sind - das ist also nicht nach jedem write Aufruf notwendig.

(*) Es wird ein aktuelle Java benötigt, um eine java Datei direkt starten zu können. Frühere Versionen erfordern erst eine Übersetzung mit Javac und dann kann das erzeugte Class-File mittels java aufgerufen werden.
 

Zurück
Oben