UTF-8转换成Shift_jis,识别非Shift_jis字符,如(~、①等)

闭月羞花猫 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,似乎这个文件中还隐藏着什么。
 

你可能感兴趣的:(web应用,乱码解决方案)