2014年11月25日火曜日

CodingErrorAction.IGNOREとCodingErrorAction.REPLACE とCodingErrorAction.REPORT

CodingErrorAction.IGNOREとCodingErrorAction.REPLACE とCodingErrorAction.REPORTを使ったサンプルコードを書いてみました。


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

コメントを投稿