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
)进行硬编码并使用它,但这样做会让我不清楚我在做什么......)
如果您知道所有输入都将在基本多语言平面(U + 0000到U + FFFF)中,那么您可以使用:
char character = 'x';
int codePoint = character;
Run Code Online (Sandbox Code Playgroud)
使用从隐式转换char
到int
,在JLS 5.1.2规定:
对原始类型的19个特定转换称为扩展原始转换:
- ...
char
对int
,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代码单元的值是相同的.
如果您需要能够应对更复杂的情况,则需要更复杂的代码.