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)) ;
} }