public class StringUtil {
/**
* 判斷是否為中文字元
* @param c
* @return
*/
private static boolean isChinese(char c) {
// GENERAL_PUNCTUATION 判斷中文的“號
// CJK_SYMBOLS_AND_PUNCTUATION 判斷中文的。號
// HALFWIDTH_AND_FULLWIDTH_FORMS 判斷中文的,號
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
/**
* 轉換成AS400字元數組
* @param srcStr
* @param len
* @return
*/
private static char[] getAS400Char(String srcStr,int len) {
char[] charArray = srcStr.toCharArray();
int dbLength = 0 ;
boolean start = false ; // 中文開始
boolean end = false ; // 中文結束
boolean duration = false ; // 中文持續
int charLength = 0 ;
for (int i = 0; i < charArray.length; i++) {
// 判斷是否是中文字元
if (isChinese(charArray[i])) {
if(duration)
start = false ;
else
start = true ;
duration = true ;
end = false ;
dbLength ++ ; // 中文字元本身就應當比一般字元多一位
}
else if(duration){ // 遇到非中文字元時,如果已經開始中文,那麼結束
end = true ;
}
dbLength ++ ; // 無論如何佔一位長度
//如果中文開始,那麼加一位
if(start){
dbLength ++ ;
start = false ;
}
// 如果中文結束,加一位
if(duration && end){
dbLength ++ ;
duration = false ;
}
// 如果資料庫長度超過限制,那麼退出
if(dbLength > len)
break ;
else if(duration){ // 如果是中文字元中,因為下次無論如何一定會增加一位長度,如果此長度超過,那麼退出
if((dbLength +1) > len)
break ;
}
charLength ++ ;
}
char[] targetArr = new char[charLength] ;
for(int i = 0 ; i < charLength ; i ++){
targetArr[i] = charArray[i] ;
}
return targetArr ;
}
/**
* 擷取指定長度的符合AS400儲存規範的字串
* @param srcStr
* @param len
* @return
*/
public static String getAS400Str(String srcStr,int len){
if(srcStr == null)
return null ;
return String.valueOf(getAS400Char(srcStr, len)) ;
}
}