2 * windows-31j encoding utilities
4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sourceforge.jindolf.archiver;
10 import java.nio.ByteBuffer;
11 import java.nio.charset.CharacterCodingException;
12 import java.nio.charset.Charset;
13 import java.nio.charset.CharsetDecoder;
14 import java.nio.charset.CodingErrorAction;
15 import jp.sourceforge.jindolf.parser.DecodeErrorInfo;
16 import jp.sourceforge.jindolf.parser.DecodedContent;
19 * windows-31jエンコーディング(機種依存文字)に関する諸々。
21 public final class Win31j{
24 public static final char REP_CHAR = '\ufffd';
26 /** windows-31j Charset. */
27 public static final Charset CS_WIN31J = Charset.forName("windows-31j");
29 private static final CharsetDecoder WIN31JDECODER;
30 private static final ByteBuffer BYTEBUFFER = ByteBuffer.allocate(2);
33 WIN31JDECODER = CS_WIN31J.newDecoder();
34 WIN31JDECODER.onMalformedInput(CodingErrorAction.REPORT);
35 WIN31JDECODER.onUnmappableCharacter(CodingErrorAction.REPORT);
36 WIN31JDECODER.reset();
46 throw new AssertionError();
51 * winsows-31jエンコーディングされたと想定した2バイトデータ
58 public static synchronized char getWin31jChar(byte b1, byte b2){
61 WIN31JDECODER.reset();
63 BYTEBUFFER.put(b1).put(b2);
67 replaced = WIN31JDECODER.decode(BYTEBUFFER).charAt(0);
68 }catch(CharacterCodingException e){
76 * デコードエラーがwindows-31jに由来する物と仮定して
78 * 1バイトエラーもしくは復号に失敗すればU+FFFDを返す。
82 public static char getWin31jChar(DecodeErrorInfo info){
83 if( ! info.has2nd() ) return REP_CHAR;
85 byte b1 = info.getRawByte1st();
86 byte b2 = info.getRawByte2nd();
87 char replaceChar = getWin31jChar(b1, b2);
94 * windows-31jによる復号での補完を試みる。
97 public static void supplyWin31jChar(DecodedContent content){
98 if( ! content.hasDecodeError() ) return;
100 for(DecodeErrorInfo info : content.getDecodeErrorList()){
101 int pos = info.getCharPosition();
102 char replaceChar = getWin31jChar(info);
103 content.setCharAt(pos, replaceChar);