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

问题描述 投票:0回答:3

我需要用代码点和换行符做一些事情。我有一个函数需要

char
的代码点,如果它是
\r
,它需要有不同的行为。我有这个:

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

但这非常丑陋,而且当然不是正确的方法。这样做的正确方法是什么?

(我知道我可以对数字

13
\r
的十进制标识符)进行硬编码并使用它,但这样做会让我不清楚我在做什么......)

java unicode char codepoint
3个回答
6
投票

如果您知道所有输入都将在基本多语言平面(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 代码单元连接在一起形成单个字符。

来自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 代码单元的值相同。

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


4
投票

如果我理解你的问题,你可以简单地将

char
转换为
int
,类似这样

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

输出是

13

0
投票

我知道这个问题很旧,但是现有的答案都没有真正回答这个问题,包括已接受的答案。

您可以直接将代码点与字符进行比较。

if (codePoint == '\r')
© www.soinside.com 2019 - 2024. All rights reserved.