1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.myfaces.shared.renderkit.html.util;
20
21 import java.io.IOException;
22 import java.io.Writer;
23
24 /**
25 * Converts characters outside of latin-1 set in a string to numeric character references.
26 *
27 */
28 public abstract class UnicodeEncoder
29 {
30 /**
31 * Encodes the given string, so that it can be used within a html page.
32 * @param string the string to convert
33 */
34 public static String encode (String string)
35 {
36 if (string == null)
37 {
38 return "";
39 }
40
41 StringBuilder sb = null;
42 char c;
43 for (int i = 0; i < string.length (); ++i)
44 {
45 c = string.charAt(i);
46 if (((int)c) >= 0x80)
47 {
48 if( sb == null )
49 {
50 sb = new StringBuilder( string.length()+4 );
51 sb.append( string.substring(0,i) );
52 }
53 //encode all non basic latin characters
54 sb.append("&#");
55 sb.append((int)c);
56 sb.append(";");
57 }
58 else if( sb != null )
59 {
60 sb.append(c);
61 }
62 }
63
64 return sb != null ? sb.toString() : string;
65 }
66
67 public static void encode (Writer writer, String string) throws IOException
68 {
69 if (string == null)
70 {
71 return;
72 }
73
74 int start = 0;
75 char c;
76 for (int i = 0; i < string.length (); ++i)
77 {
78 c = string.charAt(i);
79 if (((int)c) >= 0x80)
80 {
81 if (start < i)
82 {
83 writer.write(string, start, i-start);
84 }
85 start = i+1;
86 //encode all non basic latin characters
87 writer.write("&#");
88 writer.write(Integer.toString((int)c));
89 writer.write(";");
90 }
91 }
92
93 if (start == 0)
94 {
95 writer.write(string);
96 }
97 else if (start < string.length())
98 {
99 writer.write(string,start,string.length()-start);
100 }
101 }
102
103 public static void encode (Writer writer, char[] cbuf, int off, int len) throws IOException
104 {
105 if (cbuf == null)
106 {
107 return;
108 }
109
110 int start = off;
111 char c;
112 for (int i = off; i < off+len; ++i)
113 {
114 c = cbuf[i];
115 if (((int)c) >= 0x80)
116 {
117 if (start < i)
118 {
119 writer.write(cbuf, start, i-start);
120 }
121 start = i+1;
122 //encode all non basic latin characters
123 writer.write("&#");
124 writer.write(Integer.toString((int)c));
125 writer.write(";");
126 }
127 }
128
129 if (start == off)
130 {
131 writer.write(cbuf, off, len);
132 }
133 else if (start < off+len)
134 {
135 writer.write(cbuf,start,off+len-start);
136 }
137 }
138
139 public static void encode (Writer writer, String cbuf, int off, int len) throws IOException
140 {
141 if (cbuf == null)
142 {
143 return;
144 }
145
146 int start = off;
147 char c;
148 for (int i = off; i < off+len; ++i)
149 {
150 c = cbuf.charAt(i);
151 if (((int)c) >= 0x80)
152 {
153 if (start < i)
154 {
155 writer.write(cbuf, start, i-start);
156 }
157 start = i+1;
158 //encode all non basic latin characters
159 writer.write("&#");
160 writer.write(Integer.toString((int)c));
161 writer.write(";");
162 }
163 }
164
165 if (start == off)
166 {
167 writer.write(cbuf, off, len);
168 }
169 else if (start < off+len)
170 {
171 writer.write(cbuf,start,off+len-start);
172 }
173 }
174 }