在中文處理中,全角(全形)與半角(半形)字符轉換是常見需求。全角字符佔兩個字節位置,半角佔一個。ASCII 可見字符範圍 ! (33) 到 ~ (126),對應全角 ! (65281) 到 ~ (65374),差值為 65248。空格特殊:半角 32,全角 12288,不遵循該偏移。本文提供完整工具類實現雙向轉換。
!~ 範圍內字符 +65248;其餘不變。!~ 範圍內字符 -65248;其餘不變。package com.whatycms.common.util;
import org.apache.commons.lang.StringUtils;
public class BCConvert {
// 半角範圍
static final char DBC_CHAR_START = 33; // '!'
static final char DBC_CHAR_END = 126; // '~'
// 全角範圍
static final char SBC_CHAR_START = 65281; // '!'
static final char SBC_CHAR_END = 65374; // '~'
// 偏移量
static final int CONVERT_STEP = 65248;
// 空格
static final char SBC_SPACE = 12288; // 全角空格
static final char DBC_SPACE = ' '; // 半角空格
/**
* 半角轉全角
*/
public static String bj2qj(String src) {
if (src == null) return src;
StringBuilder buf = new StringBuilder(src.length());
char[] ca = src.toCharArray();
for (char c : ca) {
if (c == DBC_SPACE) {
buf.append(SBC_SPACE);
} else if (c >= DBC_CHAR_START && c <= DBC_CHAR_END) {
buf.append((char) (c + CONVERT_STEP));
} else {
buf.append(c);
}
}
return buf.toString();
}
/**
* 全角轉半角
*/
public static String qj2bj(String src) {
if (src == null) return src;
StringBuilder buf = new StringBuilder(src.length());
char[] ca = src.toCharArray();
for (char c : ca) {
if (c >= SBC_CHAR_START && c <= SBC_CHAR_END) {
buf.append((char) (c - CONVERT_STEP));
} else if (c == SBC_SPACE) {
buf.append(DBC_SPACE);
} else {
buf.append(c);
}
}
return buf.toString();
}
public static void main(String[] args) {
System.out.println(StringUtils.trimToEmpty(" a,b ,c "));
String s = "nihaohk | nihehe ,。 78 7 ";
s = BCConvert.qj2bj(s);
System.out.println(s); // nihaohk | nihehe ,。 78 7
System.out.println(BCConvert.bj2qj(s)); // nihaohk | nihehe ,。 78 7
}
}
StringBuilder 和字符數組遍歷,避免字符串拼接開銷。StringUtils.trimToEmpty,實際項目可按需引入或替換為 JDK 原生 trim()。全半角轉換本質是 Unicode 碼點的固定偏移映射,掌握核心偏移量(65248)與特殊空格處理,即可輕鬆實現高效、準確的轉換工具。上述代碼已封裝為靜態方法,可直接集成到項目中使用。