1 package com.internetcds.jdbc.tds;
2
3 import java.io.UnsupportedEncodingException;
4 import java.util.Hashtable;
5
6 /***
7 * Helper class to handle server character set conversion.
8 *
9 * @author Stefan Bodewig <a href="mailto:stefan.bodewig@megabit.net">stefan.bodewig@megabit.net</a>
10 *
11 * @version $Id: EncodingHelper.html,v 1.1 2003/05/12 16:19:44 sinisa Exp $
12 */
13 public class EncodingHelper {
14 public static final String cvsVersion = "$Id: EncodingHelper.html,v 1.1 2003/05/12 16:19:44 sinisa Exp $";
15
16 /***
17 * The name of the encoding.
18 */
19 private String name;
20 /***
21 * Is this a DBCS charset (does it need more than one byte per character)?
22 */
23 private boolean wideChars;
24 /***
25 * A String containing all characters of the charset (if this is not
26 * a DBCS charset).
27 */
28 private String converted;
29
30 /***
31 * private so only the static accessor can be used.
32 */
33 private EncodingHelper(String name, boolean wideChars) {
34 this.name = name;
35 this.wideChars = wideChars;
36 if (!wideChars) {
37 converted = getString(convArray);
38 }
39 }
40
41 /***
42 * Translate the String into a byte[] in the server's encoding.
43 */
44 public byte[] getBytes(String value) {
45 try {
46 return value.getBytes(name);
47 } catch (UnsupportedEncodingException uee) {
48 return value.getBytes();
49 }
50 }
51
52 /***
53 * Translate the byte[] from the server's encoding to a Unicode String.
54 */
55 public String getString(byte[] value) {
56 return getString(value, 0, value.length);
57 }
58
59 /***
60 * Translate part of the byte[] from the server's encoding to a
61 * Unicode String.
62 *
63 * The subarray starting at index off and extending to off+len-1
64 * is translated.
65 */
66 public String getString(byte[] value, int off, int len) {
67 try {
68 return new String(value, off, len, name);
69 } catch (UnsupportedEncodingException uee) {
70 return new String(value, off, len);
71 }
72 }
73
74 /***
75 * Is this a DBCS charset (does it need more than one byte per character)?
76 */
77 public boolean isDBCS() {return wideChars;}
78
79 /***
80 * Can the given String be converted to the server's charset?
81 *
82 * <p>Does not work for DBCS charsets.
83 */
84 public boolean canBeConverted(String value) {
85 if (isDBCS()) {
86 throw new IllegalStateException(name+" is a DBCS charset");
87 }
88
89 int len = value.length();
90 for (int i=0; i<len; i++) {
91 if (converted.indexOf(value.charAt(i)) == -1) {
92 return false;
93 }
94 }
95 return true;
96 }
97
98 /***
99 * Return the helper object for the given encoding.
100 */
101 public static EncodingHelper getHelper(String encodingName) {
102 if (!initialized) {
103 synchronized (com.internetcds.jdbc.tds.EncodingHelper.class) {
104 if (!initialized) {
105 initialize();
106 }
107 }
108 }
109 return (EncodingHelper)knownEncodings.get(encodingName);
110 }
111
112 /***
113 * Array containig the bytes 0x00 - 0xFF.
114 */
115 private static byte[] convArray;
116 /***
117 * Hashtable holding instances for all known encodings.
118 */
119 private static Hashtable knownEncodings;
120 /***
121 * Simple boolean to ensure we initialize once and only once.
122 */
123 private static boolean initialized;
124
125 /***
126 * Initialize the static variables.
127 *
128 * <p>Will be called from the static block below, but some VMs
129 * (notably Microsoft's) won't run this.
130 */
131 private synchronized static void initialize() {
132 convArray = new byte[256];
133 for (int i=0; i<256; i++) {
134 convArray[i] = (byte)i;
135 }
136
137 knownEncodings = new Hashtable();
138 EncodingHelper e = new EncodingHelper("ISO8859_1", false);
139 knownEncodings.put("iso_1", e);
140 knownEncodings.put("cp1252", e);
141
142 try {
143 // simple test for the presence of i18n.jar
144 "a".getBytes("Cp437");
145
146 knownEncodings.put("cp437", new EncodingHelper("Cp437", false));
147 knownEncodings.put("cp850", new EncodingHelper("Cp850", false));
148 knownEncodings.put("cp1250", new EncodingHelper("Cp1250", false));
149 knownEncodings.put("cp1251", new EncodingHelper("Cp1251", false));
150 knownEncodings.put("cp1253", new EncodingHelper("Cp1253", false));
151 knownEncodings.put("cp1254", new EncodingHelper("Cp1254", false));
152 knownEncodings.put("cp1255", new EncodingHelper("Cp1255", false));
153 knownEncodings.put("cp1256", new EncodingHelper("Cp1256", false));
154 knownEncodings.put("cp1257", new EncodingHelper("Cp1257", false));
155
156 /*
157 * XXX are the CpXXX different from MSXXX? Used MS to be save.
158 */
159 //thai
160 knownEncodings.put("cp874", new EncodingHelper("MS874", true));
161 //japanese
162 knownEncodings.put("cp932", new EncodingHelper("MS932", true));
163 //simplified chinese
164 knownEncodings.put("cp932", new EncodingHelper("MS932", true));
165 //korean
166 knownEncodings.put("cp949", new EncodingHelper("MS949", true));
167 //traditional chinese
168 knownEncodings.put("cp950", new EncodingHelper("MS950", true));
169 } catch (UnsupportedEncodingException uee) {
170 // i18n.jar not present, only ISO-8859-1 is available
171 }
172
173 initialized = true;
174 }
175
176 static {
177 initialize();
178 }
179 }
This page automatically generated by Maven