次のコードを実行すると、間違った値が生成されるようです。
byte[] data = "\u00a5".getBytes("Shift_JIS");
[ -4, -4 ] を生成しますが、 [ 0x5c ] を期待します
「Shift-JIS」、「shift_jis」、「cp932」など、さまざまな代替名を試しましたが、すべて同じ結果が得られました。
結果のデータを Shift-JIS デコーダーにフィードすると、例外が発生します。java.nio.charset.UnmappableCharacterException: Length: 2
つまり、次のように構成されたデコーダーを使用します。
Charset charset = Charset.forName("Shift_JIS);
CharsetDecoder decoder = charset.newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
しかし、エンコーダーの出力が間違っているように見えることを考えると、デコーダーは関係ないと思います。私のポイントは、実際のバイトに関係なく、エンコーダーはデコードできないデータを生成するということです。
全角円 (U+FFE5) は [ -127 (0x81), -113 (0x8F) ] にエンコードされ、正しくデコードされます。
不思議なことに、[ 92 (0x5C) ] をデコードしようとすると、これは、単一幅円の Shift-JIS エンコーディングであると私が考えるものであり、Android/Java デコーダーはバックスラッシュを生成し、文字を 92 のままにします。
エンコーダーが特定の文字をサポートしていない場合は、「?」などの置換文字が必要です。しかし、-4 (0xFC) は有効な Shift-JIS ではないようです。Unicode 置換文字 U+FFFD でさえありません。次の行を使用すると、エンコーダーが [-4, -4] を使用するように構成されているように見えることがわかります。
Charset.forName("Shift_JIS").newEncoder().replacement()
- では、単一幅の円が Shift-JIS にマッピングされていないのはなぜですか?
- [-4, -4] は賢明なエンコーダーの置き換えですか?
- デコーダが円 (U+00A5) への 0x5C マッピングをサポートしないのはなぜですか?
- 0x5C が正しいエンコーディングでない場合、何ですか?