/*
* ファイル名 :StringUtil.java
* バージョン :01-00
* タイトル :システム共通 (カナ小文字変換)(カナ氏名チェック)(右側空白削除)
* 説明  :
*/

import java.util.HashMap;

/**
 * StringUtilクラス<br>
 */
public class StringUtil {

/**
  * 文字列中の半角カナ小文字を半角カナ大文字に変換します。<br>
  * <br>
  * 渡された文字列(半角カナ氏名・半角カナ組織名・半角カナ住所)中の半角カナ小文字(ァ,ィ,ゥ,ェ,ォ,ャ,ュ,ョ,ッ,")を半角カナ大文字(ア,イ,ウ,エ,オ,ヤ,ユ,ヨ,ツ,゙)に変換します。<br>
  * <br>
  * 変換された結果はHashMapに格納されて、値が戻されます。その際のキーは半角カナ氏名が"name"、半角カナ組織名が"organization"、半角カナ住所が"address"となります。
  * @param kanaName 半角カナ氏名
  * @param kanaOrganization 半角カナ組織名
  * @param kanaAddress 半角カナ住所
  * @return HashMap 変換結果
  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
  */
 public static HashMap toCapitalLetterHanKana( String kanaName, String kanaOrganization,
           String kanaAddress) throws IllegalArgumentException{
  HashMap hashMap = new HashMap(); //変換後のデータを格納
  boolean nullFlag = false;   //3つの引数が全てnullであった場合にはfalse、そうでなかった場合にはtrueを格納

//カナ氏名がnullでなかった場合実行
  if(kanaName != null){
   nullFlag = true;
   if(checkFullChar(kanaName) == false){
    throw new IllegalArgumentException();  //文字列中に半角文字以外があった場合、
               //IllegalArgumentExceptionをスロー
   }
   hashMap.put( "name", convertCapitalLetter(kanaName));  //変換後カナ氏名を格納
  }else{
   hashMap.put( "name", null); 
  }
  
  //カナ組織名がnullでなかった場合実行
  if(kanaOrganization != null){
   nullFlag = true;
   if(checkFullChar(kanaOrganization) == false){
    throw new IllegalArgumentException();  //文字列中に半角文字以外があった場合、
               //IllegalArgumentExceptionをスロー
   }
   hashMap.put( "organization", convertCapitalLetter(kanaOrganization));  //変換後カナ組織名を格納
  }else{
   hashMap.put( "organization", null);
  }
  
  //カナ住所がnullでなかった場合実行
  if(kanaAddress != null){
   nullFlag = true;
   if(checkFullChar(kanaAddress) == false){
    throw new IllegalArgumentException();  //文字列中に半角文字以外があった場合、
               //IllegalArgumentExceptionをスロー
   }
   hashMap.put( "address", convertCapitalLetter(kanaAddress));  //変換後カナ住所を格納
  }else{
   hashMap.put( "address", null);
  }
  
  if(nullFlag == false){
   throw new IllegalArgumentException();  //引数が3つともnullの場合、
              //IllegalArgumentExceptionをスロー
  }
  return hashMap;
 }
 
 /**
  * 指定カナ氏名を左詰で「姓+1バイト空白+名」に変換します。ただし、指定カナ氏名の文字列間に2箇所以上空白がある場合は空白を全て詰めます。
  * また、変換後の文字列が20字を超える場合、先頭から20字分の文字列を戻します。
  * @param sourceKanaName 指定カナ氏名
  * @return String 成形後カナ氏名
  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
  */
 public static String formKanaName(String sourceKanaName) throws IllegalArgumentException{
  StringBuffer kanaNameBuffer; //文字列編集用
  int lastIndex;     //カナ氏名の(文字数-1)を格納
  
  //引数チェック
  if(sourceKanaName == null){
   throw new IllegalArgumentException();  //引数がnullの場合、
              //IllegalArgumentExceptionをスロー
  }
  kanaNameBuffer = new StringBuffer     //半角空白・タブ文字列を1バイト空白に変換し、
    (sourceKanaName.replaceAll( "[ /t]+", " ")); //文字列編集用バッファに文字列を格納
  if(kanaNameBuffer.toString() == " "){
   throw new IllegalArgumentException();  //文字列の文字が全て空白の場合、
              //IllegalArgumentExceptionをスロー
  }
  if(checkFullChar(sourceKanaName) == false){
   throw new IllegalArgumentException();  //文字列中に半角文字以外があった場合、
              //IllegalArgumentExceptionをスロー
  }
  
  //文字列の左右の空白を削除
  if(kanaNameBuffer.indexOf(" ") == 0){
   kanaNameBuffer.deleteCharAt(0) ;   //左側に空白があった場合、空白を削除
  }
  lastIndex = kanaNameBuffer.length() - 1;  //カナ氏名の最後の文字のインデックスを格納
  if(kanaNameBuffer.lastIndexOf(" ") == lastIndex){
   kanaNameBuffer.deleteCharAt(lastIndex);  //右側に空白があった場合、空白を削除
  }
  
  if(kanaNameBuffer.toString().matches(".+ .+ .+") == true){
   kanaNameBuffer.replace( 0, kanaNameBuffer.length(),  //文字列中に2箇所以上空白がある場合
     kanaNameBuffer.toString().replaceAll(" ","")); //空白を全て詰める
  }
  
  if(kanaNameBuffer.length() >= 20){
   kanaNameBuffer.setLength(20); //文字列が20文字を超える場合、先頭から20文字を設定
  }
  
  return kanaNameBuffer.toString();
 }

/**
  * 指定された文字列の右側空白(半角空白、全角空白、タブ)を削除します。
  * @param targetString 右側空白削除対象文字列
  * @return String 空白削除後の文字列
  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
  */
 public static String rTrim(String targetString) throws IllegalArgumentException{
  StringBuffer targetBuffer;  //文字列編集用に文字列を格納
  
  //引数チェック
  if(targetString == null){
   throw new IllegalArgumentException();  //引数がnullの場合、
              //IllegalArgumentExceptionをスロー
  }
  
  targetBuffer = new StringBuffer(targetString);
  
  targetBuffer.replace( 0, targetBuffer.length(),      //文字列を逆順に並び替え、
   targetBuffer.reverse().toString().replaceFirst("[ /t ]+","")); //左側(実際の右側)の空白を削除
  
  return targetBuffer.reverse().toString();
 }
 
 /**
  * 渡された文字列の英数字カナ半角文字を全角文字にします。
  * @param targetString 変換対象文字列
  * @return String 変換後の文字列
  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
  */
 public static String toFullChar(String targetString) throws IllegalArgumentException{
  StringBuffer fullCharStr;     //文字列編集用
  char fullKana;
  
  //引数チェック
  if(targetString == null){
   throw new IllegalArgumentException();  //引数がnullの場合、
              //IllegalArgumentExceptionをスロー
  }
  fullCharStr = new StringBuffer(targetString.length()); //変換対象文字数分の文字列編集用バッファを取得
  
  //文字列中の半角英数字カナ文字を全角文字に変換する
  for(int i = 0; i < targetString.length(); i++){
   if(targetString.substring(i, i+1).matches("[ -~]")){
    fullCharStr.append(toFullAlphameric(targetString.charAt(i)));    //文字が半角英数字であった場合、
                        //全角英数字へ変換
   }else if(targetString.substring(i, i+1).matches("[。-゚]")){
    fullKana = toFullKana(targetString.charAt(i),targetString.charAt(i - 1)); //文字が半角カナであった場合、
                        //全角カナ文字へ変換
    if(fullKana != '゛' && fullKana != '゜' && (targetString.charAt(i) == '゙' || targetString.charAt(i) == '゚')){
     fullCharStr.deleteCharAt(fullCharStr.length()-1);        //変換対象文字が半角濁点もしくは半角半濁点かつ
                          //変換後の文字が全角濁点・全角半濁点ではない場合、
                          //1つ前に格納されている文字を削除
    }
    fullCharStr.append(fullKana);              //変換後の文字列を格納
   }else{
    fullCharStr.append(targetString.charAt(i - 1));          //対応する全角文字がない場合、変換しないで文字列バッファへ格納
   }
   
  }
  return fullCharStr.toString();
 }
 
 /**
  * 文字列中に全角文字が含まれているかをチェックします。全角文字が含まれていない場合にはtrueを、含まれていた場合にはfalseを戻します。<br>
  * 文字のUnicodeが0x0020~0x0080、もしくは、0xff61~0xff9fの範囲に含まれていなかった場合に、その文字は全角文字とみなされます。
  * @param checkString 全角有無チェック対象文字列
  * @return boolean 文字列中に全角文字がなかった場合true、あった場合false
  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
  */
 private static boolean checkFullChar(String checkString){
  
  if(!checkString.matches("[ -~。-゚]+")){
   return false;  //文字のUnicodeが0x0020~0x007e、もしくは、0xff61~0xff9fの範囲(半角文字の範囲)に含まれていなかった場合、
        //falseを戻す
  }
   
  
  return true; //文字列中に全角文字が含まれていなかった場合、trueを戻す
 }
 
 /**
  * 文字列中の半角カナ小文字を半角カナ大文字に変換します。<br>
  * <br>
  * 渡された文字列中の半角カナ小文字(ァ,ィ,ゥ,ェ,ォ,ャ,ュ,ョ,ッ,")を半角カナ大文字(ア,イ,ウ,エ,オ,ヤ,ユ,ヨ,ツ,゙)に変換し、変換した文字列を戻します。<br>
  * @param convertString 変換対象文字列
  * @return String 変換後の文字列
  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
  */
 private static String convertCapitalLetter(String convertString){
  int index;
  String before[] = {"ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ","/""}; //変換前の半角カナ小文字を格納した配列
  String after[] = {"ア","イ","ウ","エ","オ","ヤ","ユ","ヨ","ツ","゙"};  //変換後の半角カナ大文字を格納した配列
  StringBuffer stringBuffer = new StringBuffer(convertString); //文字列編集用
  
  //変換対象となる半角カナ小文字の数だけループ
  for( int i = 0; i < 10; i++){
   index = 0;  //indexを初期化
   //文字列中に変換対象となる半角カナ小文字がある間ループ
   while(index >= 0){
    index = stringBuffer.indexOf( before[i], index);  //半角カナ小文字が最初に出現する位置のインデックスを取得
    if(index >= 0){
     stringBuffer.replace( index, index + 1, after[i]); //半角カナ小文字が見つかった場合
                  //半角カナ小文字を半角カナ大文字に変換
    }
   }  
  }
  return stringBuffer.toString();
 }
 
 /**
  * 半角英数字を全角英数字へ変換します。<br>
  * @param targetCharacter 全角英数字への変換対象文字
  * @return char 変換後文字
  */
 private static char toFullAlphameric(char targetCharacter){
  final int E_DIFFERENCE = 0xff01 - 0x0021; //英数字の全角文字と半角文字のUnicodeの差
  
  switch(targetCharacter){
  case 0x0020:
   return 0x3000;    //' '(Unicode:0x0021)を' '(Unicode:0x3000)に変換
  case 0x0022:
   return 0x201d;    //'"'(Unicode:0x0022)を'”'(Unicode:0x201d)に変換
  case 0x0027:
   return 0x2019;    //'''(Unicode:0x0027)を'’'(Unicode:0x2019)に変換
  case 0x005c:
   return 0xffe5;    //'/'(Unicode:0x005c)を'¥'(Unicode:0xffe5)に変換
  default:
   targetCharacter += E_DIFFERENCE; //上記以外の半角英数字を対応する全角英数字に変換(順に並んでいる為、
            //半角英数字と全角英数字の差を半角英数字に加えることで可能)
   return targetCharacter;                         
  }
  
 }
 
 /**
  * 半角カナ文字を全角カナ文字へ変換します。<br>
  * 1つ目の引数は変換の対象となる文字です。<br>
  * 2つ目の引数は、変換の対象となる文字の1つ前の文字です。変換の対象となる文字が濁点('゙')もしくは半濁点('゚')であった場合、
  * 1つ前の文字を判別し、全角1文字で表現できる場合はそれを使用します。<br>
  * <例><br>
  * ガ → ガ<br>
  * ヴ → ヴ<br>
  * ア゙ → ア゛
  * @param targetCharacter 全角カナ文字への変換対象文字
  * @param beforeTarget 変換対象文字の1つ前の文字
  * @return char 変換後文字
  */
 private static char toFullKana(char targetCharacter,char beforeTarget){
  final char kanaArry[][] = {{'。','。'},{'「','「'},{'」','」'},{'、','、'},{'・','・'},   //半角カナと全角カナの対応表を格納
         {'ヲ','ヲ'},{'ァ','ァ'},{'ィ','ィ'},{'ゥ','ゥ'},{'ェ','ェ'},
         {'ォ','ォ'},{'ャ','ャ'},{'ュ','ュ'},{'ョ','ョ'},{'ッ','ッ'},
         {'ー','ー'},{'ア','ア'},{'イ','イ'},{'ウ','ウ'},{'エ','エ'},
         {'オ','オ'},{'カ','カ'},{'キ','キ'},{'ク','ク'},{'ケ','ケ'},
         {'コ','コ'},{'サ','サ'},{'シ','シ'},{'ス','ス'},{'セ','セ'},
         {'ソ','ソ'},{'タ','タ'},{'チ','チ'},{'ツ','ツ'},{'テ','テ'},
         {'ト','ト'},{'ナ','ナ'},{'ニ','ニ'},{'ヌ','ヌ'},{'ネ','ネ'},
         {'ノ','ノ'},{'ハ','ハ'},{'ヒ','ヒ'},{'フ','フ'},{'ヘ','ヘ'},
         {'ホ','ホ'},{'マ','マ'},{'ミ','ミ'},{'ム','ム'},{'メ','メ'},
         {'モ','モ'},{'ヤ','ヤ'},{'ユ','ユ'},{'ヨ','ヨ'},{'ラ','ラ'},
         {'リ','リ'},{'ル','ル'},{'レ','レ'},{'ロ','ロ'},{'ワ','ワ'},
         {'ン','ン'},{'゙','゛'},{'゚','゜'}};
  final char voicedArry[][] = {{'カ','ガ'},{'キ','ギ'},{'ク','グ'},{'ケ','ゲ'},{'コ','ゴ'},  //半角カナと全角カナと全角濁音カナの対応表を格納
         {'サ','ザ'},{'シ','ジ'},{'ス','ズ'},{'セ','ゼ'},{'ソ','ゾ'},
         {'タ','ダ'},{'チ','ヂ'},{'ツ','ヅ'},{'テ','デ'},{'ト','ド'},
         {'ハ','バ'},{'ヒ','ビ'},{'フ','ブ'},{'ヘ','ベ'},{'ホ','ボ'},
         {'ウ','ヴ'}};
  final char semivoicedArry[][] = {{'ハ','パ'},{'ヒ','ピ'},{'フ','プ'},{'ヘ','ペ'},{'ホ','ポ'}}; //半角カナと全角カナと全角半濁音カナの対応表を格納

//半角カナの種類数分ループさせる
  for(int i = 0; i < kanaArry.length; i++){
   if(targetCharacter == kanaArry[kanaArry.length - 2][0]){  //文字が濁点('゙')であった場合
    //全角濁音カナの種類数分ループさせる
    for(int k = 0; k < voicedArry.length; k++){
     if(beforeTarget == voicedArry[k][0]){ //対象文字列の半角カナと全角濁音カナ対応表の半角カナが一致した場合
      return voicedArry[k][1];   //文字列バッファに全角濁点カナを格納
     }
     if(k == voicedArry.length -1){   //対応する全角濁音カナがなかった場合
      return kanaArry[kanaArry.length - 2][1];  //文字列バッファに全角濁点を格納
     }
    }
   }else if(targetCharacter == kanaArry[kanaArry.length - 1][0]){ //文字が半濁点('゚')であった場合
    //全角半濁音カナの種類数分ループさせる
    for(int k = 0; k < semivoicedArry.length; k++){ 
     if(beforeTarget == semivoicedArry[k][0]){ //対象文字列の半角カナと全角半濁音カナ対応表の半角カナが一致した場合
      return semivoicedArry[k][1];  //文字列バッファに全角半濁点カナを格納
     }
     if(k == semivoicedArry.length - 1){   //対応する全角半濁音カナがなかった場合
      return kanaArry[kanaArry.length - 1][1];  //文字列バッファに全角半濁点を格納
     }
    }
   }else if(targetCharacter == kanaArry[i][0]){
    return kanaArry[i][1];  //半角カナを対応する全角カナに変換
   }
  }
  return targetCharacter;
 }
}

日文假名全半角转换空格删除相关推荐

  1. 全/半角转换,间繁体转换

    using System; using System.Collections.Generic; using System.Text; using Microsoft.VisualBasic; /// ...

  2. java 全半角转换_Java字符串全半角转换

    虽然生活中很少用到全角,但是有时还是会用到对字符串进行全半角的转换,尤其是全角转换为半角,在这里简单记录一下,以备以后使用参考: /** * 字符串全半角转换 */ package com.proje ...

  3. win7怎么彻底关闭全/半角转换快捷键? imetool.exe

    from:http://bbs.csdn.net/topics/370040889 全半角转换最tm的烦人,快捷键是shift+space,不小心按到,就各种不爽, 系统看着是可以重新设置快捷键的,但 ...

  4. 计算机中全半角转换是干什么的,全角半角切换快捷键(电脑全角和半角怎么切换)...

    搜狗输入法的全角半角切换键是:shift+空格键 (如当前在半角状态,按shift+空格键可以切换至全角:如当前在全角状态,按shift+空格键可以切换至半角) 半角与全角切换的意义 1.添加输入法不 ...

  5. Java字符全半角转换

    Java字符 以下代码可以打印出Java中的所有字符 public static void main(String[] args) {for (int i = Character.MIN_VALUE; ...

  6. Java 全半角转换

    * 全角转半角的 转换函数 * @return String */ public static final String full2HalfChange(String QJstr) { StringB ...

  7. java 全半角转换_Java 全半角转换

    * 全角转半角的 转换函数 * @return String */ public static final String full2HalfChange(String QJstr) { StringB ...

  8. python 字符串全半角转换

    2019独角兽企业重金招聘Python工程师标准>>> def strQ2B(ustring):     """全角转半角""&qu ...

  9. (七)全半角转换(转)

    public static class StringTranslate     {         /**/         /// <summary>         /// 转全角的函 ...

最新文章

  1. 企业信息化中常见决策点应对
  2. 高通与华为短暂和解,理智看待国内5G现状
  3. linux内核用什么调试,什么是开发/调试Linux内核最有效和最优雅的方式
  4. matlab中的square函数
  5. 十四、堆(Heap)
  6. mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
  7. 低碳生活:充电电池及充电器
  8. 程序员修神之路--晦涩难懂的CAP,是否完全正确?
  9. java生成二维码读取二维码,面试真题解析
  10. mathematica打包java_从Mathematica到Java的图像
  11. 执行sql报错:Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in
  12. linux设备驱动程序的编程思路,Linux设备驱动工程师之路——高级字符设备驱动程序...
  13. android - 房源登记模版
  14. MC9S12XS128 事件处理
  15. Python编程通过出生日期判断星座
  16. 数据结构—第六章 图
  17. 中国古代传说中的四大神兽
  18. 2022深圳限行一年几次免罚 有几次机会
  19. RabbitMQ第四个实操小案例——DirectExchange
  20. 开源电子原型平台 Arduino

热门文章

  1. python刷网_Python制作刷网页流量工具的代码实例
  2. 大数据用户画像系统架构设计
  3. JS7day(事件对象,事件流,事件捕获和冒泡,阻止事件流动,事件委托,学生信息表案例)
  4. driver 是什么
  5. 平台+AI:全面拥抱大模型的商业创新,打造企业数字化「柔性供应链」 | D3演讲实录
  6. c语言中tail和head的用法,linux管道命令之head与tail
  7. 北大青鸟APTECH(青岛银河)培训中心
  8. Spring Cloud应用的优雅下线与灰度发布
  9. 【305期】Spring Cloud 优雅下线+灰度发布
  10. K8S-iptables与ipvs规则