1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.mortbay.util;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public class Utf8StringBuffer
32 {
33 StringBuffer _buffer;
34 int _more;
35 int _bits;
36 boolean _errors;
37
38 Utf8StringBuffer()
39 {
40 _buffer=new StringBuffer();
41 }
42
43 Utf8StringBuffer(int capacity)
44 {
45 _buffer=new StringBuffer(capacity);
46 }
47
48 public void append(byte[] b,int offset, int length)
49 {
50 int end=offset+length;
51 for (int i=offset; i<end;i++)
52 append(b[i]);
53 }
54
55 public void append(byte b)
56 {
57 if (b>0)
58 {
59 if (_more>0)
60 {
61 _buffer.append('?');
62 _more=0;
63 _bits=0;
64 }
65 else
66 _buffer.append((char)(0x7f&b));
67 }
68 else if (_more==0)
69 {
70 if ((b&0xc0)!=0xc0)
71 {
72
73 _buffer.append('?');
74 _more=0;
75 _bits=0;
76 }
77 else if ((b & 0xe0) == 0xc0)
78 {
79
80 _more=1;
81 _bits=b&0x1f;
82 }
83 else if ((b & 0xf0) == 0xe0)
84 {
85
86 _more=2;
87 _bits=b&0x0f;
88 }
89 else if ((b & 0xf8) == 0xf0)
90 {
91
92 _more=3;
93 _bits=b&0x07;
94 }
95 else if ((b & 0xfc) == 0xf8)
96 {
97
98 _more=4;
99 _bits=b&0x03;
100 }
101 else if ((b & 0xfe) == 0xfc)
102 {
103
104 _more=5;
105 _bits=b&0x01;
106 }
107 }
108 else
109 {
110 if ((b&0xc0)==0xc0)
111 {
112 _buffer.append('?');
113 _more=0;
114 _bits=0;
115 _errors=true;
116 }
117 else
118 {
119
120 _bits=(_bits<<6)|(b&0x3f);
121 if (--_more==0)
122 _buffer.append((char)_bits);
123 }
124 }
125 }
126
127 public int length()
128 {
129 return _buffer.length();
130 }
131
132 public void reset()
133 {
134 _buffer.setLength(0);
135 _more=0;
136 _bits=0;
137 _errors=false;
138 }
139
140 public StringBuffer getStringBuffer()
141 {
142 return _buffer;
143 }
144
145 public String toString()
146 {
147 return _buffer.toString();
148 }
149
150
151
152
153
154 public boolean isError()
155 {
156 return _errors || _more>0;
157 }
158 }