Java中全角转半角的核心是Unicode码位映射:遍历字符串,对全角数字(U+FF10~FF19)、字母(U+FF21~FF3A、FF41~FF5A)、标点(U+FF01~FF5E)统一减0xfee0,全角空格(U+3000)特殊转为U+0020。

Java 中将全角字符转为半角字符,核心思路是遍历字符串,对每个全角 ASCII 字符(如全角数字、字母、空格、标点)按固定偏移量减去 0xfee0,特殊处理全角空格(0x3000 → 0x0020)。这不是简单编码转换,而是 Unicode 码位映射。
识别常见全角字符范围
全角 ASCII 类字符主要集中在 Unicode 的“CJK 兼容”区块:
- 全角数字(0-9):U+FF10 ~ U+FF19 → 半角 0-9(U+0030 ~ U+0039)
- 全角大写字母(A-Z):U+FF21 ~ U+FF3A → 半角 A-Z(U+0041 ~ U+005A)
- 全角小写字母(a-z):U+FF41 ~ U+FF5A → 半角 a-z(U+0061 ~ U+007A)
- 全角空格( ):U+3000 → 半角空格(U+0020)
- 全角标点(,。!?;:“”等):多数在 U+FF01 ~ U+FF5E,对应 U+0021 ~ U+007E
手动实现转换逻辑(推荐,轻量可控)
不依赖第三方库时,可用 StringBuilder 遍历判断并映射:
<font color="#888">public static String toHalfWidth(String str) {
if (str == null) return null;
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray()) {
if (c >= '\uFF10' && c <= '\uFF19') {
// 全角数字 → 半角数字
sb.append((char)(c - 0xFF10 + 0x30));
} else if (c >= '\uFF21' && c <= '\uFF3A') {
// 全角大写字母
sb.append((char)(c - 0xFF21 + 0x41));
} else if (c >= '\uFF41' && c <= '\uFF5A') {
// 全角小写字母
sb.append((char)(c - 0xFF41 + 0x61));
} else if (c == '\u3000') {
// 全角空格 → 半角空格
sb.append(' ');
} else if (c >= '\uFF01' && c <= '\uFF5E') {
// 全角 ASCII 标点 → 半角标点
sb.append((char)(c - 0xFF01 + 0x21));
} else {
// 其他字符(汉字、符号、控制符等)保持不变
sb.append(c);
}
}
return sb.toString();
}</font>使用 Apache Commons Text(适合已有依赖项目)
引入 Maven 依赖后,直接调用 StringUtils.toHalfWidth():
立即学习“Java免费学习笔记(深入)”;
<font color="#888"><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.12.0</version> </dependency></font>
代码示例:
<font color="#888">String full = "Hello,世界! 123"; String half = StringUtils.toHalfWidth(full); // 结果:"Hello,世界! 123"(英数标点变半角,汉字和中文标点不变)</font>
注意:该方法只转换全角 ASCII 类字符,不会动汉字、中文顿号、书名号等,行为与手动逻辑一致。
注意事项与边界情况
实际使用需留意:
- 全角中文标点(如「」、『』、【】、~、…、——)不属于上述映射范围,不会被转换,需额外规则处理
- 某些生僻全角符号(如来自旧字体或私有区)可能无标准半角对应,应原样保留
- 输入含混合内容(如 "订单号:ABC123")时,只转字母数字及英文标点,冒号“:”(U+FF1A)会被转成“:”,但“号”字不变
- 性能敏感场景建议复用 StringBuilder,避免频繁创建对象


















