天天看點

漢字轉拼音開源工具-pinyin4j

圖檔、視訊等資源檔案的指向位址在開發中一般不會出現漢字,而從易用性角度考慮,漢字給然的感覺是簡潔、直覺,是以,在開發中一般用漢字儲存資源名稱,而用拼音數字等表示資源位址,數字的區分度不如拼音。而在批量操作時,手動寫拼音對開發者來說無疑是一個天災,繁重的工作量不說,手誤從機率上将肯定是有的。

最近在做類似的項目,從網上搜了下相關的開源工具,其中pinyin4j比較容易上手,主要通過PinyinHelper工具類來實作功能,

主要方法有:

1、  toHanyuPinyinStringArray(char,HanyuPinyinOutputFormat),

toHanyuPinyinStringArray(char)

将char(漢字)轉為拼音,HanyuPinyinOutputFormat是拼音輸出的格式設定,可以不用此參數。

下面是demo代碼

public class PinYinTest {

    public staticvoid main(String[]args){

         File file= new File("E:/study-file/superboy");

         for (FilefileIn : file.listFiles()) {

             String fileName = fileIn.getName();

             System.err.println(fileName);

             System.err.println(getPinyin(fileName.substring(0,fileName.length()-4))+".jpg");

             fileIn.renameTo(new File("E:/study-file/superboy/"+ getPinyin(fileName.substring(0,fileName.length()-4))+".jpg"));

         }

    }

    public staticString getPinyin(String src){ 

           if(src!=null &&!src.trim().equalsIgnoreCase("")){ 

            char[] srcChar ; 

            srcChar=src.toCharArray(); 

            //漢語拼音格式輸出類 

            HanyuPinyinOutputFormat hanYuPinOutputFormat= new HanyuPinyinOutputFormat(); 

         //輸出設定,大小寫,音标方式等 

           hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  

            hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

           hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V); 

            String[][] temp = newString[src.length()][]; 

            for(int i=0;i<srcChar.length;i++){ 

             char c = srcChar[i]; 

             //是中文或者a-z或者A-Z轉換拼音(我的需求,是保留中文或者a-z或者A-Z) 

             if(String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")){ 

              try{ 

               temp[i] = PinyinHelper.toHanyuPinyinStringArray(srcChar[i],hanYuPinOutputFormat); 

              }catch(BadHanyuPinyinOutputFormatCombinatione) { 

               e.printStackTrace(); 

              } 

             }else if(((int)c>=65 && (int)c<=90)|| ((int)c>=97 && (int)c<=122)){ 

              temp[i] = new String[]{String.valueOf(srcChar[i])}; 

             }else{ 

              temp[i] = new String[]{""}; 

             } 

            } 

            String[] pingyinArray = Exchange(temp); 

            Set<String> pinyinSet = newHashSet<String>(); 

            for(int i=0;i<pingyinArray.length;i++){ 

             pinyinSet.add(pingyinArray[i]); 

            } 

            return pinyinSet.toArray()[0].toString(); 

           } 

           return null; 

          }

       public staticString[] Exchange(String[][] strJaggedArray){ 

          String[][] temp = DoExchange(strJaggedArray); 

           returntemp[0];        

       } 

       private staticString[][] DoExchange(String[][] strJaggedArray){ 

           intlen = strJaggedArray.length; 

           if(len>= 2){            

               intlen1 = strJaggedArray[0].length; 

               intlen2 = strJaggedArray[1].length; 

               intnewlen = len1*len2; 

              String[] temp = new String[newlen]; 

               intIndex = 0; 

               for(inti=0;i<len1;i++){ 

                  for(int j=0;j<len2;j++){ 

                      temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j]; 

                      Index ++; 

                  } 

              } 

              String[][] newArray = new String[len-1][]; 

               for(inti=2;i<len;i++){ 

                  newArray[i-1] = strJaggedArray[i];                            

              } 

              newArray[0] = temp; 

               returnDoExchange(newArray); 

           }else{ 

            returnstrJaggedArray;    

           } 

       } 

}