核心原理:字符的 Unicode 编码
在 Java 中,char 类型是一个 16 位的无符号整数,它使用的是 Unicode 字符集。当你在 Java 中将一个 char 转换为 int 时,你实际上是在获取该字符的 Unicode 码点(code point)值。

- 字符
'A'的 Unicode 码点是65。 - 字符
'a'的 Unicode 码点是97。 - 字符
'0'(数字零) 的 Unicode 码点是48。 - 字符
'中'的 Unicode 码点是20013。
- 字符
这个转换过程本质上是无信息丢失的,因为 char 本身就存储着一个整数值。
自动类型转换(隐式转换)
这是最简单、最直接的方法,当 char 和 int 进行混合运算时,Java 会自动将 char 提升为 int。
示例代码:
public class CharToIntExample {
public static void main(String[] args) {
char myChar = 'A';
// 直接将 char 赋值给 int,会发生自动类型转换
int myInt = myChar;
System.out.println("原始 char: " + myChar);
System.out.println("转换后的 int: " + myInt); // 输出 65
char digitChar = '9';
int digitInt = digitChar;
System.out.println("原始 char: " + digitChar);
System.out.println("转换后的 int: " + digitInt); // 输出 57
}
}
输出:

原始 char: A
转换后的 int: 65
原始 char: 9
转换后的 int: 57
强制类型转换(显式转换)
虽然自动转换已经足够,但你也可以使用强制类型转换 (int) 来明确表示你的意图,这种方式和方法一的效果在简单转换中是完全一样的。
示例代码:
public class CharToIntExplicitExample {
public static void main(String[] args) {
char myChar = 'B';
// 使用强制类型转换
int myInt = (int) myChar;
System.out.println("原始 char: " + myChar);
System.out.println("强制转换后的 int: " + myInt); // 输出 66
}
}
输出:
原始 char: B
强制转换后的 int: 66
通过数学运算
将 char 与一个整数(通常是 0)进行加法运算,也能得到其 int 值,这种方法在语法上有点多余,但能帮助理解其底层原理。

示例代码:
public class CharToIntMathExample {
public static void main(String[] args) {
char myChar = 'C';
// 通过加法运算实现转换
int myInt = myChar + 0;
System.out.println("原始 char: " + myChar);
System.out.println("通过运算转换后的 int: " + myInt); // 输出 67
}
}
重要应用场景:将数字字符转为数字
这是将 char 转为 int 最常见的实际用途,将用户输入的字符 '5' 转换成整数 5。
关键点:
'5'(字符) 的 Unicode 码点是53。5(数字) 的值是5。- 要实现转换,需要用字符
'5'的码点53减去字符'0'的码点48。
示例代码:
public charToDigitExample {
public static void main(String[] args) {
char digitChar = '7';
// 将数字字符 '7' 转换为整数 7
int digitInt = digitChar - '0';
System.out.println("原始字符: '" + digitChar + "'");
System.out.println("转换后的数字: " + digitInt); // 输出 7
// 验证原理
System.out.println("'7'的码点: " + (int)digitChar); // 55
System.out.println("'0'的码点: " + (int)'0'); // 48
System.out.println("55 - 48 = " + (55 - 48)); // 7
}
}
输出:
原始字符: '7'
转换后的数字: 7
'7'的码点: 55
'0'的码点: 48
55 - 48 = 7
常见陷阱与注意事项
区分 char 和 String
新手常常会混淆 char (单个字符) 和 String (字符串)。
-
错误示范: 你不能直接将
String转为int。String有自己的Integer.parseInt()方法。 -
正确做法:
String strNumber = "123"; int number = Integer.parseInt(strNumber); // 使用 String 的方法 char charDigit = '1'; int digit = charDigit - '0'; // 使用 char 的转换
处理非数字字符
如果你尝试将一个非数字字符(如 'A')通过 char - '0' 的方式转换,会得到一个没有实际意义的数字,而不是报错。
示例代码:
public void nonDigitConversion() {
char letter = 'A';
int result = letter - '0'; // 65 - 48 = 17
System.out.println("将 'A' 转换为数字: " + result); // 输出 17,这通常不是我们想要的
}
在进行 char - '0' 转换前,最好先检查字符是否为数字。
char c = '5';
if (c >= '0' && c <= '9') {
int num = c - '0';
System.out.println("转换成功: " + num);
} else {
System.out.println("错误:输入的不是数字字符");
}
处理 Unicode 补充字符(超出 BMP 的字符)
标准的 char 类型只能表示 Unicode 基本多语言平面 (BMP) 中的字符,范围是 \u0000 到 \uffff,对于 BMP 之外的字符(如一些Emoji或罕见的汉字),它们需要用一对 char(称为代理对,surrogate pair)来表示,或者直接使用 int 类型来存储其完整的码点。
如果你有一个 int 变量存储了这种高码点字符(0x1F600 代表笑脸 Emoji),你可以使用 char 相关的静态方法来处理:
// 假设有一个 int 存储了高码点字符
int codePoint = 0x1F600; // 😀 的 Unicode 码点
// 1. 判断它是否需要代理对
if (Character.isSupplementaryCodePoint(codePoint)) {
System.out.println("这是一个需要代理对的字符");
// 2. 将码点转换为 char 代理对
char[] surrogatePair = Character.toChars(codePoint);
System.out.println("代理对数量: " + surrogatePair.length); // 输出 2
System.out.println("高代理: " + surrogatePair[0]);
System.out.println("低代理: " + surrogatePair[1]);
// 3. 如果你想从代理对转换回 int (码点)
int originalCodePoint = Character.codePointAt(surrogatePair, 0);
System.out.println("从代理对还原的码点: " + originalCodePoint); // 输出 128512
}
这个场景比较特殊,但对于处理国际化文本很重要,在大多数常规应用中,你只需记住 char 转 int 就是获取其 Unicode 码点即可。
| 转换场景 | 推荐方法 | 示例代码 | 说明 |
|---|---|---|---|
| 获取字符的 Unicode 码点 | 自动类型转换 | int i = 'A'; |
最简单、最常用的方法。 |
| 明确表示转换意图 | 强制类型转换 | int i = (int) 'A'; |
语法上更明确,效果与自动转换相同。 |
| 将数字字符转为数字值 | 减去 '0' | int i = '5' - '0'; |
最常见的实际应用,必须记住这个技巧。 |
| 处理字符串形式的数字 | Integer.parseInt() |
int i = Integer.parseInt("123"); |
用于 String 到 int 的转换,与 char 无关。 |
希望这份详细的解释能帮助你完全理解 Java 中 char 到 int 的转换!
