001 package org.apache.commons.ssl.asn1; 002 003 import java.io.ByteArrayOutputStream; 004 import java.util.Vector; 005 006 public final class Strings { 007 public static String fromUTF8ByteArray(byte[] bytes) { 008 int i = 0; 009 int length = 0; 010 011 while (i < bytes.length) { 012 length++; 013 if ((bytes[i] & 0xf0) == 0xf0) { 014 // surrogate pair 015 length++; 016 i += 4; 017 } else if ((bytes[i] & 0xe0) == 0xe0) { 018 i += 3; 019 } else if ((bytes[i] & 0xc0) == 0xc0) { 020 i += 2; 021 } else { 022 i += 1; 023 } 024 } 025 026 char[] cs = new char[length]; 027 028 i = 0; 029 length = 0; 030 031 while (i < bytes.length) { 032 char ch; 033 034 if ((bytes[i] & 0xf0) == 0xf0) { 035 int codePoint = ((bytes[i] & 0x03) << 18) | ((bytes[i + 1] & 0x3F) << 12) | ((bytes[i + 2] & 0x3F) << 6) | (bytes[i + 3] & 0x3F); 036 int U = codePoint - 0x10000; 037 char W1 = (char) (0xD800 | (U >> 10)); 038 char W2 = (char) (0xDC00 | (U & 0x3FF)); 039 cs[length++] = W1; 040 ch = W2; 041 i += 4; 042 } else if ((bytes[i] & 0xe0) == 0xe0) { 043 ch = (char) (((bytes[i] & 0x0f) << 12) 044 | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)); 045 i += 3; 046 } else if ((bytes[i] & 0xd0) == 0xd0) { 047 ch = (char) (((bytes[i] & 0x1f) << 6) | (bytes[i + 1] & 0x3f)); 048 i += 2; 049 } else if ((bytes[i] & 0xc0) == 0xc0) { 050 ch = (char) (((bytes[i] & 0x1f) << 6) | (bytes[i + 1] & 0x3f)); 051 i += 2; 052 } else { 053 ch = (char) (bytes[i] & 0xff); 054 i += 1; 055 } 056 057 cs[length++] = ch; 058 } 059 060 return new String(cs); 061 } 062 063 public static byte[] toUTF8ByteArray(String string) { 064 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 065 char[] c = string.toCharArray(); 066 int i = 0; 067 068 while (i < c.length) { 069 char ch = c[i]; 070 071 if (ch < 0x0080) { 072 bOut.write(ch); 073 } else if (ch < 0x0800) { 074 bOut.write(0xc0 | (ch >> 6)); 075 bOut.write(0x80 | (ch & 0x3f)); 076 } 077 // surrogate pair 078 else if (ch >= 0xD800 && ch <= 0xDFFF) { 079 // in error - can only happen, if the Java String class has a 080 // bug. 081 if (i + 1 >= c.length) { 082 throw new IllegalStateException("invalid UTF-16 codepoint"); 083 } 084 char W1 = ch; 085 ch = c[++i]; 086 char W2 = ch; 087 // in error - can only happen, if the Java String class has a 088 // bug. 089 if (W1 > 0xDBFF) { 090 throw new IllegalStateException("invalid UTF-16 codepoint"); 091 } 092 int codePoint = (((W1 & 0x03FF) << 10) | (W2 & 0x03FF)) + 0x10000; 093 bOut.write(0xf0 | (codePoint >> 18)); 094 bOut.write(0x80 | ((codePoint >> 12) & 0x3F)); 095 bOut.write(0x80 | ((codePoint >> 6) & 0x3F)); 096 bOut.write(0x80 | (codePoint & 0x3F)); 097 } else { 098 bOut.write(0xe0 | (ch >> 12)); 099 bOut.write(0x80 | ((ch >> 6) & 0x3F)); 100 bOut.write(0x80 | (ch & 0x3F)); 101 } 102 103 i++; 104 } 105 106 return bOut.toByteArray(); 107 } 108 109 /** 110 * A locale independent version of toUpperCase. 111 * 112 * @param string input to be converted 113 * @return a US Ascii uppercase version 114 */ 115 public static String toUpperCase(String string) { 116 boolean changed = false; 117 char[] chars = string.toCharArray(); 118 119 for (int i = 0; i != chars.length; i++) { 120 char ch = chars[i]; 121 if ('a' <= ch && 'z' >= ch) { 122 changed = true; 123 chars[i] = (char) (ch - 'a' + 'A'); 124 } 125 } 126 127 if (changed) { 128 return new String(chars); 129 } 130 131 return string; 132 } 133 134 /** 135 * A locale independent version of toLowerCase. 136 * 137 * @param string input to be converted 138 * @return a US ASCII lowercase version 139 */ 140 public static String toLowerCase(String string) { 141 boolean changed = false; 142 char[] chars = string.toCharArray(); 143 144 for (int i = 0; i != chars.length; i++) { 145 char ch = chars[i]; 146 if ('A' <= ch && 'Z' >= ch) { 147 changed = true; 148 chars[i] = (char) (ch - 'A' + 'a'); 149 } 150 } 151 152 if (changed) { 153 return new String(chars); 154 } 155 156 return string; 157 } 158 159 public static byte[] toByteArray(String string) { 160 byte[] bytes = new byte[string.length()]; 161 162 for (int i = 0; i != bytes.length; i++) { 163 char ch = string.charAt(i); 164 165 bytes[i] = (byte) ch; 166 } 167 168 return bytes; 169 } 170 171 public static String[] split(String input, char delimiter) { 172 Vector v = new Vector(); 173 boolean moreTokens = true; 174 String subString; 175 176 while (moreTokens) { 177 int tokenLocation = input.indexOf(delimiter); 178 if (tokenLocation > 0) { 179 subString = input.substring(0, tokenLocation); 180 v.addElement(subString); 181 input = input.substring(tokenLocation + 1); 182 } else { 183 moreTokens = false; 184 v.addElement(input); 185 } 186 } 187 188 String[] res = new String[v.size()]; 189 190 for (int i = 0; i != res.length; i++) { 191 res[i] = (String) v.elementAt(i); 192 } 193 return res; 194 } 195 }