日文假名全半角轉換空格刪除

/*
* ファイル名 :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;
 }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章