3

次のコードを実行すると、間違った値が生成されるようです。

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 が正しいエンコーディングでない場合、何ですか?
4

1 に答える 1