闭月羞花猫 2007/11/27 于南京新城
需求描述:
在读取一本UTF-8编码的文本文档,将其中的内容转换成Shift_jis编码,如果遇到
~、① 之类不属于Shift_jis的字符,用特殊符号代替,无视,报错。
代码:
public static String checkIsSjis(String inString) {
// Create the encoder and decoder for the character encoding
Charset charset = Charset.forName("Shift_jis");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
// エラー種別 説明 動作の制御方法
// 不正入力エラー
// 入力が正当な16ビットUnicodeシーケンスでなかった場合。 onMalformedInputメソッドを使用(3 cases)
encoder.onMalformedInput(CodingErrorAction.REPORT);
// ......
// マップ不可文字エラー 入力文字シーケンスは正当であるが、指定された文字セットの文字にはマッピングされていない場合。
// onUnmappableCharacterメソッドを使用(3 cases)
// ① エラーが発生した入力文字を無視して処理を継続します。
// encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
// ② CodingErrorAction.REPORT エラーが発生した時点で処理を中断し、戻り値または例外にてエラーを報告します。
// encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
// ③ エラーが発生した入力文字を指定した置換文字(列)に置換して出力し、処理を継続します。置換文字は replaceWith(byte[]
// newReplacement)
// メソッドによって設定することができます。デフォルトは「?」(={(byte)'?'})です。設定されている置換文字列は
// replacement メソッドにより取得できます。
encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
encoder.replaceWith("☆".getBytes());
String result = inString;
try {
// Convert a string to bytes in a ByteBuffer
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(inString));
// Convert bytes in a ByteBuffer to a character ByteBuffer and then
// to a string.
CharBuffer cbuf = decoder.decode(bbuf);
result = cbuf.toString();
} catch (CharacterCodingException cce) {
String errorMessage = "Exception during character encoding/decoding: "
+ cce.getMessage();
System.out.println(errorMessage);
cce.printStackTrace();
}
return result;
}
对于这个代码似乎有点bug,就是当inString只有一个字节的时候,比如inString='a', 的时候,似乎,返回的结果是一个空,而不是我预想的'a', 不知道这个是不是jdk的一个bug。
以后如果有发现,将继续补充!
还有就是一个txt文件,比如从ms932, 然后保存为 utf-8, 这个时候,原来这个文件上面的内容,变成乱码,这个时候,即使你把文件的内容都删除,文件的大小都不会是0k,
而是1k,似乎这个文件中还隐藏着什么。