我需要用代码点和换行符做一些事情。我有一个接受char
's 代码点的函数,如果是\r
,它需要以不同的方式表现。我有这个:
if (codePoint == Character.codePointAt(new char[] {'\r'}, 0)) {
但这很丑陋,当然也不是正确的做法。这样做的正确方法是什么?
(我知道我可以对数字13
(十进制标识符\r
)进行硬编码并使用它,但这样做会使我不清楚我在做什么......)
如果您知道所有输入都将在基本多语言平面(U+0000 到 U+FFFF)中,那么您可以使用:
char character = 'x';
int codePoint = character;
char
这使用从to的隐式转换int
,如 JLS 5.1.2 中所指定:
原始类型的 19 种特定转换称为扩展原始类型转换:
- ...
char
到int
,long
,float
, 或double
...
将 char 扩大到整数类型 T 的转换将 char 值的表示形式零扩展以填充更宽的格式。
但是,achar
只是一个 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