たとえば、System.out.println("╚"); ? として表示されます。System.out.println("\u255a"); も同様です。
なぜこれが機能しないのですか?Stdout は実際にこれらの文字をサポートしているので、わかりません。
たとえば、System.out.println("╚"); ? として表示されます。System.out.println("\u255a"); も同様です。
なぜこれが機能しないのですか?Stdout は実際にこれらの文字をサポートしているので、わかりません。
この質問を参照してください。Java のデフォルトの文字エンコーディングが UTF-8 でない場合 (Windows と OS X ではそうであるように見えますが、Linux ではないようです)、エンコードに失敗した文字は疑問符に変換されます。JVMのコマンドラインに正しいスイッチを渡すことができます(-Dfile.encoding=UTF-8
一部の端末では、目の前にWindowsボックスがありません)。または、環境変数を設定できます。これがどうあるべきかを移植可能に判断することは不可能かもしれませんが、たとえば、常に Win32 コンソールで実行することがわかっている場合は、文字セットを選択して、文字を標準出力に書き込む前に明示的にエンコードするか、直接書き込むことができます。必要なバイト。
Windows コマンド プロンプトは、デフォルトで古い DOS OEM エンコーディングを使用します。System.out
デフォルトのシステム エンコーディングを使用します。これは、Windows の "ANSI" エンコーディングです。ただし、System.console()
コンソールのエンコーディングを検出します。
U+255A (╚) は、これらの範囲が Windows のアクセント付き文字に使用されていたため、OEM コードページでサポートされる可能性が高くなります。
詳細については、こちら、こちら、こちら、およびこちらをご覧ください。
個人的には、コードページ 65001 のオプションは避けたいと思います。これは、コンソール (バッチ ファイルが機能しなくなる) と Java (バグ-Dfile.encoding
)の両方で意図しない副作用が生じるためです。
Windows を使用している場合、コンソールは UTF-8 ではなく、Java が使用するネイティブ エンコーディングと同じ UTF-16 であるため、ワイド文字列を直接出力できるはずです。
私は Java プログラマーではありませんが、C の場合、UTF-16 を実際に印刷_setmode()
するには、特別なモードで呼び出す必要があります。_O_U16TEXT
代わりにマルチバイト文字列を出力したい場合はchcp 65001
、Win32 API を使用してコマンドラインから、またはプログラムでWindows コンソールを UTF-8 に設定できますが、記載されているように書き込まれたバイト数ではなく、書き込まれた文字数を返すSetConsoleOutputCP()
バグに注意してください。WriteFile()
. このバグにより、Windows コンソールの UTF-8 が Perl、PHP、および Ruby から破損します。私は、MSVCRT でさえ犠牲になると信じています。
幸運を!