2 * content builder for UTF-8 (UCS2 only)
\r
4 * License : The MIT License
\r
5 * Copyright(c) 2010 olyutorskii
\r
8 package jp.sourceforge.jindolf.parser;
\r
11 * "UTF-8"エンコーディング用デコードハンドラ。
\r
12 * {@link StreamDecoder}からの通知に従い、
\r
13 * {@link DecodedContent}へとデコードする。
\r
14 * UCS-4はUTF-16エラー扱い。
\r
16 public class ContentBuilderUCS2 extends ContentBuilder{
\r
19 * サロゲートペア文字(上位,下位)をUTF-16BEバイト列に変換する。
\r
23 public static byte[] charToUTF16(char ch){
\r
24 byte[] result = new byte[2];
\r
25 result[0] = (byte)(ch >> 8);
\r
26 result[1] = (byte)(ch & 0xff);
\r
33 * 長さ0で空の{@link DecodedContent}がセットされる。
\r
35 public ContentBuilderUCS2(){
\r
42 * 長さ0で空の{@link DecodedContent}がセットされる。
\r
43 * @param capacity 初期容量
\r
44 * @throws NegativeArraySizeException 容量指定が負。
\r
46 public ContentBuilderUCS2(int capacity)
\r
47 throws NegativeArraySizeException{
\r
56 private void initImpl(){
\r
57 this.content.init();
\r
65 protected void init(){
\r
72 * @param seq {@inheritDoc}
\r
73 * @throws DecodeException {@inheritDoc}
\r
75 public void charContent(CharSequence seq)
\r
76 throws DecodeException{
\r
79 int length = seq.length();
\r
82 for(int pos = 0; pos < length; pos++){
\r
83 char ch = seq.charAt(pos);
\r
85 if( ! Character.isHighSurrogate(ch)
\r
86 && ! Character.isLowSurrogate (ch) ){
\r
91 CharSequence chopped = seq.subSequence(startPos, pos);
\r
92 this.content.append(chopped);
\r
96 byte[] barr = charToUTF16(ch);
\r
97 for(byte bval : barr){
\r
98 this.content.addDecodeError(bval);
\r
102 if(startPos < length){
\r
103 CharSequence chopped = seq.subSequence(startPos, length);
\r
104 this.content.append(chopped);
\r
112 * @param errorArray {@inheritDoc}
\r
113 * @param offset {@inheritDoc}
\r
114 * @param length {@inheritDoc}
\r
115 * @throws DecodeException {@inheritDoc}
\r
117 public void decodingError(byte[] errorArray, int offset, int length)
\r
118 throws DecodeException{
\r
119 int limit = offset + length;
\r
121 for(int bpos = offset; bpos < limit; bpos++){
\r
122 byte bval = errorArray[bpos];
\r
123 this.content.addDecodeError(bval);
\r