exécutant le code suivant semble générer les valeurs erronées:Pourquoi l'encodage Android Shift-JIS du symbole Yen (U + 00A5) produit -4, -4?
byte[] data = "\u00a5".getBytes("Shift_JIS");
Il produit [-4, -4], mais je pense [0x5c]
J'ai essayé plusieurs noms alternatifs, « Shift -JIS "," shift_jis "," cp932 "et tous produisent le même résultat.
Quand je nourris les données obtenues dans le décodeur Shift-JIS, je reçois une exception: java.nio.charset.UnmappableCharacterException: Length: 2
C'est, avec le décodeur configuré comme suit:
Charset charset = Charset.forName("Shift_JIS);
CharsetDecoder decoder = charset.newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
Mais compte tenu de la sortie du l'encodeur a l'air faux, je suppose que le décodeur n'est pas pertinent. Mon point est que, indépendamment des octets réels, le codeur génère des données qu'il ne peut pas décoder.
Le Yen pleine largeur (U + FFE5) est codé en [-127 (0x81), -113 (0x8F)] et se décode correctement. Bizarrement, si j'essaie de décoder [92 (0x5C)] ce que je pense être le codage Shift-JIS du Yen simple largeur, le décodeur Android/Java produit une barre oblique inverse, laissant le caractère 92.
Si le codeur ne prenait pas en charge un caractère donné, je m'attendrais à un caractère de remplacement tel que '?'. Mais -4 (0xFC) ne semble même pas être valide Shift-JIS. Ce n'est même pas le caractère de remplacement Unicode U + FFFD. En utilisant la ligne suivante, je peux voir que le codeur semble être configuré pour utiliser [-4, -4]:
Charset.forName("Shift_JIS").newEncoder().replacement()
- Alors pourquoi n'est pas le Yen simple largeur cartographié dans Shift-JIS?
- Est-ce que [-4, -4] est un remplacement d'encodeur sensible?
- Pourquoi le décodeur ne supporte-t-il pas le mappage 0x5C vers Yen (U + 00A5)?
- Si 0x5C n'est pas le codage correct, qu'est-ce que c'est?