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 件のコメント:
コメントを投稿