获取char代码点的方法是什么?

Pok*_*u22 4 java unicode char codepoint

我需要用代码点和换行符做一些事情.我有一个带有char代码点的函数,如果\r它需要表现不同.我有这个:

if (codePoint == Character.codePointAt(new char[] {'\r'}, 0)) {
Run Code Online (Sandbox Code Playgroud)

但这非常难看,当然也不是正确的做法.这样做的正确方法是什么?

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

Jon*_*eet 6

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

char character = 'x';
int codePoint = character;
Run Code Online (Sandbox Code Playgroud)

使用从隐式转换charint,在JLS 5.1.2规定:

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

  • ...
  • charint,long,float,或者double

...

将char的扩展转换为整数类型T零扩展char值的表示以填充更宽的格式.

但是,a 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代码单元的值是相同的.

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