4

我需要用代码点和换行符做一些事情。我有一个接受char's 代码点的函数,如果是\r,它需要以不同的方式表现。我有这个:

if (codePoint == Character.codePointAt(new char[] {'\r'}, 0)) {

但这很丑陋,当然也不是正确的做法。这样做的正确方法是什么?

(我知道我可以对数字13(十进制标识符\r)进行硬编码并使用它,但这样做会使我不清楚我在做什么......)

4

2 回答 2

6

如果您知道所有输入都将在基本多语言平面(U+0000 到 U+FFFF)中,那么您可以使用:

char character = 'x';
int codePoint = character;

char这使用从to的隐式转换int,如 JLS 5.1.2 中所指定:

原始类型的 19 种特定转换称为扩展原始类型转换:

  • ...
  • charint, 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 码单元的值是相同的。

如果您需要能够应对更复杂的情况,您将需要更复杂的代码。

于 2014-09-13T19:37:55.300 回答
4

如果我理解您的问题,您可以简单地charint

char ch = '\r';
int codePoint = (int) ch;
System.out.println(codePoint);

输出是

13
于 2014-09-13T19:34:06.457 回答