2017-01-04 1 views
0

私は数時間のうちに、スキャナを介してコンソールにØのような文字を入力して数値を取得すると、いつも65533(符号なしの最大値)という結論に終わったのです。文字のchar値として(à、Ø、æ、æなど)65533を受け取る!

これは、ラテン文字には当てはまりません。どんな考え?

public static void main(String[] args) { 

    Scanner sc = new Scanner(System.in); 
    char[] chars = sc.next().toCharArray(); 

    for(int i = 0; i < chars.length; i++){ 

     System.out.println((int)chars[i]); 
    } 
} 
+2

コードの一部を投稿する必要があります – Vampire

+0

実際はシンプルで簡単なコードです。私はコードを追加しました。 – phadam

答えて

2

65533 = Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)

はすなわち、あなたのキャラクターは、使用している文字エンコーディングの中に正しく解釈されていない、ので、フォールバック値に置き換えられています。

+0

どうすれば修正できますか? – phadam

+0

@ Vampireのコメントに続き、あなたのコードを投稿してください。問題を再現できるようにします。残念ながら、 – Alohci

1

エンコードに問題があります。
System.inにあるバイトは、Scannerがそれらのバイトを文字に変換するために使用するエンコーディングに含まれていません。
あなたのSystem.inCp1252(Windowsのデフォルトのエンコーディング)ですが、スキャナーユーザーのUTF-8はバイトをデコードすると思います。
バイトシーケンスは有効なUTF-8文字ではないため、代わりに置換文字が使用されます。

Scanner sc = new Scanner(System.in, System.getProperty("file.encoding"));を実行すると、コードがどこでも正しく動作するはずです。

+0

!私はbase64に文字列をエンコードし、そこから私の操作を引き継ぐことを考えています。 – phadam

+0

私はそれがどのように役立つべきかわかりませんが、それがあなたの問題を解決すれば、それを続けてください。しかし、base64文字列をいくつかの文字に変換する必要がある場合は、 'System.in'が' file.encoding'の内容になるようにバイトコードのコード化を行う必要があります。 – Vampire

+0

しかし、 'Scanner sc = new Scanner(System.in、" Cp1252 ");' – phadam

関連する問題