项目中实现对日文的全半角转换,此处记录留以后用,转载请注明来源
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ConvertHalfJPUtils { 2 //justify is all half 3 public static boolean isAllHalf(String param) { 4 char[] chs = param.toCharArray(); 5 for (int i = 0; i < chs.length; i++) { 6 if (!(('\uFF61' <= chs[i]) && (chs[i] <= '\uFF9F')) 7 && !(('\u0020' <= chs[i]) && (chs[i] <= '\u007E'))) { 8 return false; 9 } 10 } 11 return true; 12 } 13 14 //justify is half 15 public static boolean isHalf(char chs) { 16 if (!(('\uFF61' <= chs) && (chs <= '\uFF9F')) 17 && !(('\u0020' <= chs) && (chs <= '\u007E'))) { 18 return false; 19 } 20 21 return true; 22 } 23 24 //have half 25 public static boolean containHalf(String param) { 26 char[] chs = param.toCharArray(); 27 for (int i = 0; i < chs.length; i++) { 28 if (isHalf(chs[i])) { 29 return true; 30 } 31 } 32 return false; 33 } 34 35 // 半角转全角:not contain japanese 36 public static String ToSBC(String input) { 37 if (input == null) { 38 return null; 39 } 40 41 char[] c = input.toCharArray(); 42 for (int i = 0; i < c.length; i++) { 43 if (c[i] == 32) { 44 c[i] = (char) 12288; 45 continue; 46 } 47 if (c[i] < 127){ 48 c[i] = (char) (c[i] + 65248); 49 } 50 } 51 return new String(c); 52 } 53 54 /**/// / 55 // / 转半角的函数(DBC case):not contain japanese 56 // / 57 // /任意字符串 58 // /半角字符串 59 // / 60 // /全角空格为12288,半角空格为32 61 // /其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 62 // / 63 public static String ToDBC(String input) { 64 if (input == null) { 65 return null; 66 } 67 68 char[] c = input.toCharArray(); 69 for (int i = 0; i < c.length; i++) { 70 if (c[i] == 12288) { 71 c[i] = (char) 32; 72 continue; 73 } 74 if (c[i] > 65280 && c[i] < 65375){ 75 c[i] = (char) (c[i] - 65248); 76 } 77 } 78 return new String(c); 79 } 80 81 //full to half begin 82 private static final char[] ZENKAKU_KATAKANA = {'ァ', 'ア', 'ィ', 'イ', 'ゥ', 83 'ウ', 'ェ', 'エ', 'ォ', 'オ', 'カ', 'ガ', 'キ', 'ギ', 'ク', 'グ', 'ケ', 'ゲ', 84 'コ', 'ゴ', 'サ', 'ザ', 'シ', 'ジ', 'ス', 'ズ', 'セ', 'ゼ', 'ソ', 'ゾ', 'タ', 85 'ダ', 'チ', 'ヂ', 'ッ', 'ツ', 'ヅ', 'テ', 'デ', 'ト', 'ド', 'ナ', 'ニ', 'ヌ', 86 'ネ', 'ノ', 'ハ', 'バ', 'パ', 'ヒ', 'ビ', 'ピ', 'フ', 'ブ', 'プ', 'ヘ', 'ベ', 87 'ペ', 'ホ', 'ボ', 'ポ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ャ', 'ヤ', 'ュ', 'ユ', 88 'ョ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ヮ', 'ワ', 'ヰ', 'ヱ', 'ヲ', 'ン', 89 'ヴ', 'ヵ', 'ヶ'}; 90 91 private static final String[] HANKAKU_KATAKANA = {"ァ", "ア", "ィ", "イ", "ゥ", 92 "ウ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", "ク", "グ", "ケ", 93 "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", 94 "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", "ヅ", "テ", "デ", "ト", "ド", 95 "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", 96 "ブ", "プ", "ヘ", "ベ", "ペ", "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", 97 "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", 98 "ワ", "イ", "エ", "ヲ", "ン", "ヴ", "カ", "ケ"}; 99 100 private static final char ZENKAKU_KATAKANA_FIRST_CHAR = ZENKAKU_KATAKANA[0]; 101 102 private static final char ZENKAKU_KATAKANA_LAST_CHAR = ZENKAKU_KATAKANA[ZENKAKU_KATAKANA.length - 1]; 103 104 //Full kata to half kata 105 public static String zenkakuKatakanaToHankakuKatakana(char c) { 106 if (c >= ZENKAKU_KATAKANA_FIRST_CHAR && c <= ZENKAKU_KATAKANA_LAST_CHAR) { 107 return HANKAKU_KATAKANA[c - ZENKAKU_KATAKANA_FIRST_CHAR]; 108 } else { 109 return String.valueOf(c); 110 } 111 } 112 113 //Full kata to half kata 114 public static String zenkakuKatakanaToHankakuKatakana(String s) { 115 StringBuffer sb = new StringBuffer(); 116 for (int i = 0; i < s.length(); i++) { 117 char originalChar = s.charAt(i); 118 String convertedChar = zenkakuKatakanaToHankakuKatakana(originalChar); 119 sb.append(convertedChar); 120 } 121 return sb.toString(); 122 123 } 124 125 //full to half end 126 //half to full kata begin 127 private static final char[] HANKAKU_KATAKANA1 = {'。', '「', '」', '、', '・', 128 'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', 129 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 130 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 131 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 132 'レ', 'ロ', 'ワ', 'ン', '゙', '゚'}; 133 134 private static final char[] ZENKAKU_KATAKANA1 = {'。', '「', '」', '、', '・', 135 'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', 136 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 137 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 138 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 139 'レ', 'ロ', 'ワ', 'ン', '゛', '゜'}; 140 141 private static final char HANKAKU_KATAKANA_FIRST_CHAR1 = HANKAKU_KATAKANA1[0]; 142 143 private static final char HANKAKU_KATAKANA_LAST_CHAR1 = HANKAKU_KATAKANA1[HANKAKU_KATAKANA1.length - 1]; 144 145 /** 146 * 半角カタカナから全角カタカナへ変換します。 147 * 148 * @param c 変換前の文字 149 * @return 変換後の文字 150 */ 151 public static char hankakuKatakanaToZenkakuKatakana(char c) { 152 if (c >= HANKAKU_KATAKANA_FIRST_CHAR1 && c <= HANKAKU_KATAKANA_LAST_CHAR1) { 153 return ZENKAKU_KATAKANA1[c - HANKAKU_KATAKANA_FIRST_CHAR1]; 154 } else { 155 return c; 156 } 157 } 158 159 /** 160 * 2文字目が濁点・半濁点で、1文字目に加えることができる場合は、合成した文字を返します。 161 * 合成ができないときは、c1を返します。 162 * 163 * @param c1 変換前の1文字目 164 * @param c2 変換前の2文字目 165 * @return 変換後の文字 166 */ 167 public static char mergeChar(char c1, char c2) { 168 if (c2 == '゙') { 169 if ("カキクケコサシスセソタチツテトハヒフヘホ".indexOf(c1) >= 0) { 170 switch (c1) { 171 case 'カ': 172 return 'ガ'; 173 case 'キ': 174 return 'ギ'; 175 case 'ク': 176 return 'グ'; 177 case 'ケ': 178 return 'ゲ'; 179 case 'コ': 180 return 'ゴ'; 181 case 'サ': 182 return 'ザ'; 183 case 'シ': 184 return 'ジ'; 185 case 'ス': 186 return 'ズ'; 187 case 'セ': 188 return 'ゼ'; 189 case 'ソ': 190 return 'ゾ'; 191 case 'タ': 192 return 'ダ'; 193 case 'チ': 194 return 'ヂ'; 195 case 'ツ': 196 return 'ヅ'; 197 case 'テ': 198 return 'デ'; 199 case 'ト': 200 return 'ド'; 201 case 'ハ': 202 return 'バ'; 203 case 'ヒ': 204 return 'ビ'; 205 case 'フ': 206 return 'ブ'; 207 case 'ヘ': 208 return 'ベ'; 209 case 'ホ': 210 return 'ボ'; 211 } 212 } 213 } else if (c2 == '゚') { 214 if ("ハヒフヘホ".indexOf(c1) >= 0) { 215 switch (c1) { 216 case 'ハ': 217 return 'パ'; 218 case 'ヒ': 219 return 'ピ'; 220 case 'フ': 221 return 'プ'; 222 case 'ヘ': 223 return 'ペ'; 224 case 'ホ': 225 return 'ポ'; 226 } 227 } 228 } 229 return c1; 230 } 231 232 /** 233 * 文字列中の半角カタカナを全角カタカナに変換します。 234 * 235 * @param s 変換前文字列 236 * @return 変換後文字列 237 */ 238 public static String hankakuKatakanaToZenkakuKatakana(String s) { 239 if (s.length() == 0) { 240 return s; 241 } else if (s.length() == 1) { 242 return String.valueOf(hankakuKatakanaToZenkakuKatakana(s.charAt(0))); 243 } else { 244 StringBuffer sb = new StringBuffer(s); 245 int i = 0; 246 for (i = 0; i < sb.length() - 1; i++) { 247 char originalChar1 = sb.charAt(i); 248 char originalChar2 = sb.charAt(i + 1); 249 char margedChar = mergeChar(originalChar1, originalChar2); 250 if (margedChar != originalChar1) { 251 sb.setCharAt(i, margedChar); 252 sb.deleteCharAt(i + 1); 253 } else { 254 char convertedChar = hankakuKatakanaToZenkakuKatakana(originalChar1); 255 if (convertedChar != originalChar1) { 256 sb.setCharAt(i, convertedChar); 257 } 258 } 259 } 260 if (i < sb.length()) { 261 char originalChar1 = sb.charAt(i); 262 char convertedChar = hankakuKatakanaToZenkakuKatakana(originalChar1); 263 if (convertedChar != originalChar1) { 264 sb.setCharAt(i, convertedChar); 265 } 266 } 267 return sb.toString(); 268 } 269 270 } 271 272 //half to full kata end 273 274 /* 275 * ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞ 276 * ただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽ 277 * まみむめもゃやゅゆょよらりるれろゎわゐゑをん 278 * to 279 * ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ 280 * タダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポ 281 * マミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ 282 */ 283 public static String zenkakuHiraganaToZenkakuKatakana(String s) { 284 StringBuffer sb = new StringBuffer(s); 285 for (int i = 0; i < sb.length(); i++) { 286 char c = sb.charAt(i); 287 if (c >= 'ぁ' && c <= 'ん') { 288 sb.setCharAt(i, (char) (c - 'ぁ' + 'ァ')); 289 } 290 } 291 return sb.toString(); 292 } 293 294 /* to 295 * ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞ 296 * ただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽ 297 * まみむめもゃやゅゆょよらりるれろゎわゐゑをん 298 * 299 * ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ 300 * タダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポ 301 * マミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ 302 */ 303 public static String zenkakuKatakanaToZenkakuHiragana(String s) { 304 StringBuffer sb = new StringBuffer(s); 305 for (int i = 0; i < sb.length(); i++) { 306 char c = sb.charAt(i); 307 if (c >= 'ァ' && c <= 'ン') { 308 sb.setCharAt(i, (char) (c - 'ァ' + 'ぁ')); 309 } else if (c == 'ヵ') { 310 sb.setCharAt(i, 'か'); 311 } else if (c == 'ヶ') { 312 sb.setCharAt(i, 'け'); 313 } else if (c == 'ヴ') { 314 sb.setCharAt(i, 'う'); 315 sb.insert(i + 1, '゛'); 316 i++; 317 } 318 } 319 return sb.toString(); 320 } 321 322 323 public static String halfToFull(String str) { 324 String result = ""; 325 if (str != null) { 326 result = ToSBC(str); 327 if (containHalf(result)) { 328 result = hankakuKatakanaToZenkakuKatakana(result); 329 } 330 } 331 332 return result; 333 } 334 335 public static String fullToHalf(String str) { 336 String result = ""; 337 if (str != null) { 338 result = ToDBC(str); 339 if (!isAllHalf(result)) { 340 result = zenkakuKatakanaToHankakuKatakana(result); 341 } 342 } 343 344 return result; 345 } 346 347 public static void main(String[] args) { 348 /*System.out.println(halfToFull("12カキasad12中国!@、??1415")); 349 System.out.println(halfToFull("wwsdas323423;';-=@#`~")); 350 System.out.println(halfToFull("ガ パ゙")); 351 System.out.println(containHalf("213ダdsdカ ニヴ"));*/ 352 } 353 } 354