我需要用代码点和换行符做一些事情。我有一个函数需要
char
的代码点,如果它是 \r
,它需要有不同的行为。我有这个:
if (codePoint == Character.codePointAt(new char[] {'\r'}, 0)) {
但这非常丑陋,而且当然不是正确的方法。这样做的正确方法是什么?
(我知道我可以对数字
13
(\r
的十进制标识符)进行硬编码并使用它,但这样做会让我不清楚我在做什么......)
如果您知道所有输入都将在基本多语言平面(U+0000 到 U+FFFF)中,那么您可以使用:
char character = 'x';
int codePoint = character;
使用从
char
到 int
的隐式转换,如 JLS 5.1.2 中所指定:
19 种基本类型的特定转换称为拓宽基本类型转换:
- ...
至char
、int
、long
或float
double
...
将 char 扩大转换为整型 T 对 char 值的表示进行零扩展以填充更宽的格式。
但是,
char
只是一个UTF-16代码单位。 Character.codePointAt
的要点在于它处理 BMP 之外的代码点,这些代码点由 代理对 组成 - 两个 UTF-16 代码单元连接在一起形成单个字符。
来自JLS 3.1:
Unicode 标准最初被设计为固定宽度的 16 位字符编码。此后它已被更改为允许表示需要超过 16 位的字符。合法代码点的范围现在为 U+0000 到 U+10FFFF,使用十六进制 U+n 表示法。代码点大于 U+FFFF 的字符称为增补字符。为了仅使用 16 位单元表示完整的字符范围,Unicode 标准定义了一种称为 UTF-16 的编码。在此编码中,补充字符表示为 16 位代码单元对,第一个来自高代理范围(U+D800 到 U+DBFF),第二个来自低代理范围(U+DC00 到 U +DFFF)。对于 U+0000 到 U+FFFF 范围内的字符,代码点和 UTF-16 代码单元的值相同。
如果您需要能够应对更复杂的情况,您将需要更复杂的代码。
如果我理解你的问题,你可以简单地将
char
转换为 int
,类似这样
char ch = '\r';
int codePoint = (int) ch;
System.out.println(codePoint);
输出是
13
我知道这个问题很旧,但是现有的答案都没有真正回答这个问题,包括已接受的答案。
您可以直接将代码点与字符进行比较。
if (codePoint == '\r')