我需要使用代码点和换行符来做一些事情。我有一个函数,它接受char
的代码点,如果它是\r
,它需要表现不同。我有这个:
if (codePoint == Character.codePointAt(new char[] {'\r'}, 0)) {
但这非常难看, 当然 不是正确的方法。这样做的正确方法是什么?
(我知道我可以硬编码13
(\r
的十进制标识符)并使用它,但这样做会让我不清楚我在做什么......)< /子>
答案 0 :(得分:6)
如果你知道你的所有输入都将在Basic Multilingual Plane(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代码单元连接在一起形成一个单独的字符。 / p>
来自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代码单元的值是相同的。
如果您需要能够应对更复杂的情况,则需要更复杂的代码。
答案 1 :(得分:4)
如果我理解了您的问题,您只需将char
转换为int
,就像这样
char ch = '\r';
int codePoint = (int) ch;
System.out.println(codePoint);
输出
13