public static void sampleCodingErroAction(String hex, CodingErrorAction actionOnMalformedInput, CodingErrorAction actionOnUnmappableCharacter){ ByteBuffer buff = ByteBuffer.allocate(hex.length()/2); for (int i = 0; i < hex.length(); i+=2) { buff.put((byte)Integer.parseInt(hex.substring(i, i+2), 16)); } buff.rewind(); Charset cs = Charset.forName("shift-jis"); CharBuffer cb = null; try { cb = cs.newDecoder() .onMalformedInput(actionOnMalformedInput) .onUnmappableCharacter(actionOnUnmappableCharacter) .decode(buff); System.out.println(cb.toString()); }catch(Exception e){ System.out.println("error"); } } public static void main(String args[]){ String hex1 = "93FA967B8CEA"; //日本語 String hex2 = "93FA967B8C00EA"; //不正な文字 System.out.print("正しいShift-JIS ");//A sampleCodingErroAction(hex1, CodingErrorAction.IGNORE, CodingErrorAction.IGNORE); System.out.print("不正なShift-JIS(Ignore) ");//B sampleCodingErroAction(hex2, CodingErrorAction.IGNORE, CodingErrorAction.IGNORE); System.out.print("不正なShift-JIS(Replace) ");//C sampleCodingErroAction(hex2, CodingErrorAction.REPLACE, CodingErrorAction.REPLACE); System.out.print("不正なShift-JIS(Report) ");//D sampleCodingErroAction(hex2, CodingErrorAction.REPORT, CodingErrorAction.REPORT); }
hex1はshift-jisで書かれた"日本語"という文字列の16進法表記です。
hex2は、hex1の間に不正なCharacterである00を挟んだ"不正な"文字列です。
これを実行すると出力結果は下記のようになります。
正しいShift-JIS 日本語
不正なShift-JIS(Ignore) 日本
不正なShift-JIS(Replace) 日本��
不正なShift-JIS(Report) error
Aの場合正しいShift-JISコードを変換しているので、「日本語」と正しくでます。CodingErrorAction.IGNOREを指定していますが、不正な入力はないので、この値は使われることはなく、何を指定しても同じです。
B~Cの場合は、不正な値があるので、onMalformedInput、onUnmappableCharacterの指定の仕方によって出力結果が違います。
CodingErrorAction.IGNOREを指定した場合、不正な値は無視されますので、正しく解釈できた「日本」までが出力されています。なお、「日本」の直後は空白文字などが出力されているわけではなく、改行されています。
Cの場合は、不正な値をReplaceしているので、��というReplaceされた値が出力されています。
Dの場合は、不正な場合はエラーをReportするように指定しているので、Exceptionが発生しdecodeがされないままで終了しています。
0 件のコメント:
コメントを投稿