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

时间:2014-09-13 19:28:39

标签: java unicode char codepoint

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

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

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

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

2 个答案:

答案 0 :(得分:6)

如果你知道你的所有输入都将在Basic Multilingual Plane(U + 0000到U + FFFF)中,那么你可以使用:

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

使用从charint的隐式转换,如JLS 5.1.2中所述:

  

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

     
      
  • ...
  •   
  • charintlongfloatdouble
  •   
     

...

     

将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