如何获取Unicode字符的代码?

Geo*_*Geo 63 java unicode character

假设我有这个:

char registered = '®';
Run Code Online (Sandbox Code Playgroud)

或者umlaut,或者任何unicode字符.我怎么能得到它的代码?

Jon*_*eet 105

只需将其转换为int:

char registered = '®';
int code = (int) registered;
Run Code Online (Sandbox Code Playgroud)

实际上有一个隐式转换char,int所以你不必像我上面那样明确地指定它,但在这种情况下我会这样做,以明确你想要做的事情.

这将给出UTF-16代码单元 - 与基本多语言平面中定义的任何字符的Unicode代码点相同.(并且只有BMP字符可以表示为charJava中的值.)正如Andrzej Doyle的回答所说,如果您希望Unicode代码点来自任意字符串,请使用Character.codePointAt().

一旦你获得了UTF-16代码单元或Unicode代码点,但是它们是整数,由你自己做什么.如果你想要一个字符串表示,你需要决定什么样的你想要表示的.(例如,如果您知道该值将始终在BMP中,您可能需要一个固定的4位十六进制表示U+,例如"U+0020"空格.)这超出了本问题的范围,因为我们不知道是什么要求是.

  • 它适用于表示"U + FFFF"以下的Unicode字符的每个`char`,但不适用于每个Unicode字符,因为`char`不能代表所有Unicode.根据你的`char`的来源,你可能需要做一些更复杂的事情(并且真的应该做好准备). (8认同)
  • 要将其转换为十六进制,请使用`Integer#toHexString()`. (4认同)
  • @Geo:基本多语言平面中的任何东西,是的.您不能在Java中的单个字符中表示U + FFFF上方的字符.但是char被有效地定义为UTF-16码点. (2认同)

And*_*yle 34

更完整但更冗长的方法是使用Character.codePointAt方法.这将处理'高代理'字符,这些字符不能由a表示的范围内的单个整数char表示.

在这个例子中,你已经给这不是绝对必要的-如果(Unicode)的字符可以容纳一个(Java)的内部char(如registered局部变量),那么它必须落在内\u0000\uffff范围,您将不再需要担心代理对.但是如果你在String/char数组中查看可能更高的代码点,那么调用这个方法是明智的,以便覆盖边缘情况.

例如,而不是

String input = ...;
char fifthChar = input.charAt(4);
int codePoint = (int)fifthChar;
Run Code Online (Sandbox Code Playgroud)

使用

String input = ...;
int codePoint = Character.codePointAt(input, 4);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这不仅仅是稍微减少的代码,而且它将为您处理代理对的检测.

  • 此外,String 类中也有相同的方法,[String#codePointAt](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#codePointAt-int-) (2认同)

Fel*_*ype 8

在Java中,char在技术上是一个"16位整数",所以你可以简单地将它转换为int,你就会得到它的代码.来自Oracle:

char数据类型是单个16位Unicode字符.它的最小值为'\ u0000'(或0),最大值为'\ uffff'(或65,535(含)).

所以你可以简单地将它转换为int.

char registered = '®';
System.out.println(String.format("This is an int-code: %d", (int) registered));
System.out.println(String.format("And this is an hexa code: %x", (int) registered));
Run Code Online (Sandbox Code Playgroud)