Mark:Java实现日文中半角与全角输入之间的装换

项目中实现对日文的全半角转换,此处记录留以后用,转载请注明来源

  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   
View Code

 

转载于:https://www.cnblogs.com/weinuts/p/5591052.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值