Java工具类——全角半角字符相互转换

来源:互联网 发布:听书软件排行 编辑:程序博客网 时间:2024/05/16 06:25
  1. import org.apache.commons.lang.StringUtils;    
  2.     
  3. /**  
  4.  * <PRE>  
  5.  * 提供对字符串的全角->半角,半角->全角转换  
  6.  * </PRE>  
  7.  */    
  8. public class BCConvert {    
  9.     
  10.     /**  
  11.      * ASCII表中可见字符从!开始,偏移位值为33(Decimal)  
  12.      */    
  13.     static final char DBC_CHAR_START = 33// 半角!    
  14.     
  15.     /**  
  16.      * ASCII表中可见字符到~结束,偏移位值为126(Decimal)  
  17.      */    
  18.     static final char DBC_CHAR_END = 126// 半角~    
  19.     
  20.     /**  
  21.      * 全角对应于ASCII表的可见字符从!开始,偏移值为65281  
  22.      */    
  23.     static final char SBC_CHAR_START = 65281// 全角!    
  24.     
  25.     /**  
  26.      * 全角对应于ASCII表的可见字符到~结束,偏移值为65374  
  27.      */    
  28.     static final char SBC_CHAR_END = 65374// 全角~    
  29.     
  30.     /**  
  31.      * ASCII表中除空格外的可见字符与对应的全角字符的相对偏移  
  32.      */    
  33.     static final int CONVERT_STEP = 65248// 全角半角转换间隔    
  34.     
  35.     /**  
  36.      * 全角空格的值,它没有遵从与ASCII的相对偏移,必须单独处理  
  37.      */    
  38.     static final char SBC_SPACE = 12288// 全角空格 12288    
  39.     
  40.     /**  
  41.      * 半角空格的值,在ASCII中为32(Decimal)  
  42.      */    
  43.     static final char DBC_SPACE = ' '// 半角空格    
  44.     
  45.     /**  
  46.      * <PRE>  
  47.      * 半角字符->全角字符转换    
  48.      * 只处理空格,!到˜之间的字符,忽略其他  
  49.      * </PRE>  
  50.      */    
  51.     private static String bj2qj(String src) {    
  52.         if (src == null) {    
  53.             return src;    
  54.         }    
  55.         StringBuilder buf = new StringBuilder(src.length());    
  56.         char[] ca = src.toCharArray();    
  57.         for (int i = 0; i < ca.length; i++) {    
  58.             if (ca[i] == DBC_SPACE) { // 如果是半角空格,直接用全角空格替代    
  59.                 buf.append(SBC_SPACE);    
  60.             } else if ((ca[i] >= DBC_CHAR_START) && (ca[i] <= DBC_CHAR_END)) { // 字符是!到~之间的可见字符    
  61.                 buf.append((char) (ca[i] + CONVERT_STEP));    
  62.             } else { // 不对空格以及ascii表中其他可见字符之外的字符做任何处理    
  63.                 buf.append(ca[i]);    
  64.             }    
  65.         }    
  66.         return buf.toString();    
  67.     }    
  68.     
  69.     /**  
  70.      * <PRE>  
  71.      * 全角字符->半角字符转换    
  72.      * 只处理全角的空格,全角!到全角~之间的字符,忽略其他  
  73.      * </PRE>  
  74.      */    
  75.     public static String qj2bj(String src) {    
  76.         if (src == null) {    
  77.             return src;    
  78.         }    
  79.         StringBuilder buf = new StringBuilder(src.length());    
  80.         char[] ca = src.toCharArray();    
  81.         for (int i = 0; i < src.length(); i++) {    
  82.             if (ca[i] >= SBC_CHAR_START && ca[i] <= SBC_CHAR_END) { // 如果位于全角!到全角~区间内    
  83.                 buf.append((char) (ca[i] - CONVERT_STEP));    
  84.             } else if (ca[i] == SBC_SPACE) { // 如果是全角空格    
  85.                 buf.append(DBC_SPACE);    
  86.             } else { // 不处理全角空格,全角!到全角~区间外的字符    
  87.                 buf.append(ca[i]);    
  88.             }    
  89.         }    
  90.         return buf.toString();    
  91.     }    
  92.     
  93.     public static void main(String[] args) {    
  94.         System.out.println(StringUtils.trimToEmpty(" a,b ,c "));    
  95.         String s = "nihaohk |   nihehe ,。 78  7 ";    
  96.         s=BCConvert.qj2bj(s);    
  97.         System.out.println(s);    
  98.         System.out.println(BCConvert.bj2qj(s));    
  99.     }    
  100. }    
0 0