如何获得Unicode字符的代码?


67

假设我有这个:

char registered = '®';

umlaut,或任何unicode字符。我如何获得其代码?

Answers:


111

只需将其转换为int

char registered = '®';
int code = (int) registered;

实际上,存在从char到的隐式转换,int因此您不必像上面所做的那样显式地指定它,但是在这种情况下,我会这样做以使您清楚地知道要执行的操作。

这将提供UTF-16代码单元-与基本多语言平面中定义的任何字符的Unicode代码点相同。(只有BMP字符可以用charJava表示为值。)正如Andrzej Doyle的回答所说,如果要从任意字符串中获取Unicode代码点,请使用Character.codePointAt()

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


2
@Geo:是的,基本的多语言平面中的任何内容。您无法在Java中的单个字符中表示U + FFFF上方的字符。但是将char有效地定义为UTF-16代码点。
乔恩·斯基特

9
它适用于char下面表示Unicode字符U+FFFF的每个字符,但不适用于每个Unicode字符,因为char不能表示所有Unicode。根据您的来源char,您可能需要做一些更复杂的事情(并且确实应该为此做准备)。
JaakkoK,2010年

4
并将其转换为十六进制,请使用Integer#toHexString()
BalusC,2010年

1
如果在基本多语言平面之外怎么办?
fzzfzzfzz

1
@fzzfzzfzz:那么您根本就不会将它作为一个整体开始char,但是可以使用char.Convert.ToUtf32
乔恩·斯基特

37

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

在示例中,您给出的代码并非绝对必要-如果(Unicode)字符可以放在单个(Java)内char(例如registered局部变量),则它必须在\u0000to\uffff范围内,并且您不需要担心代理对。但是,如果您正在从String / char数组中查看可能更高的代码点,则为了覆盖边缘情况,调用此方法是明智的。

例如,代替

String input = ...;
char fifthChar = input.charAt(4);
int codePoint = (int)fifthChar;

采用

String input = ...;
int codePoint = Character.codePointAt(input, 4);

在这种情况下,这不仅会减少一些代码,而且还会为您处理代理对的检测。


2
另外,String类中有相同的方法String#codePointAt
Alexandr

11

从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));

1
它的工作原理,即使欧元字符String.format("%x", (int) '€') == 0x20ac == '\u20ac'
ATorras

1

对我来说,只有“ Integer.toHexString(已注册)”可以按照我想要的方式工作:

char registered = '®';
System.out.println("Answer:"+Integer.toHexString(registered));

该答案将仅为您提供表中通常显示的字符串表示形式。乔恩·斯基特(Jon Skeet)的答案进一步说明了这一点。


2
正如我对答案的评论所指出的那样,这是因为“您想要的方式”是生成代码的十六进制表示形式-这不是此问题的要求。代码本身是一个整数;“如何创建整数的十六进制表示形式”是另一回事。(例如,对于Unicode代码点,您还应该考虑要使用多少个十六进制数字-您可能想对BMP字符使用4,对其他字符使用6,或者始终使用6,或者始终使用偶数...)
乔恩Skeet

这说明了你写的内容。是什么让您认为代码在定义上是整数?对我来说,代码是符号的组合,不一定是数字或整数。您的回答确实非常有用,但是最后我花了半个小时的时间找到了我所理解的代码,也许这样可以为其他用户节省一些时间。
Darius Miliauskas,2015年

2
这就是Unicode定义的方式。来自unicode.org/standard/principles.html:“为Unicode标准定义的每个代码元素分配了一个数字。这些数字中的每一个均称为代码点,当在文本中引用时,以十六进制形式列出例如,代码点U + 0041是十六进制数字0041(等于十进制数字65)。它表示Unicode标准中的字符“ A”。我已经编辑了答案,以明确说明为什么“字符'X'的代码是什么”的答案是数字而不是字符串。
乔恩·斯基特

1

有一个开源库MgntUtils,它具有实用程序类StringUnicodeEncoderDecoder。该类提供了静态方法,可将任何String转换为Unicode序列,反之亦然。非常简单实用。要转换字符串,您只需执行以下操作:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(myString);

例如,字符串“ Hello World”将转换为

“ \ u0048 \ u0065 \ u006c \ u006c \ u006f \ u0020 \ u0057 \ u006f \ u0072 \ u006c \ u0064”

它适用于任何语言。这里是文章的链接,该文章解释了有关该库的所有详细信息:MgntUtils。查找字幕“字符串Unicode转换器”。该库可以作为Maven工件获得,也可以取自Github(包括源代码和Javadoc)


0

亲爱的朋友,乔恩·斯凯特(Jon Skeet)说,您可以找到字符十进制代码,但它不是字符十六进制代码,因为它应该在unicode中提及,因此您应该通过HexCode而不是Deciaml来表示字符代码。

http://unicode.codeplex.com上有一个开源工具,可提供有关字符或句子的完整信息。

因此最好创建一个将char作为参数并返回ahexCode作为字符串的解析器

public static String GetHexCode(char character)
    {
        return String.format("{0:X4}", GetDecimal(character));
    }//end

希望对你有帮助


1
“所以您应该通过HexCode而不是Deciaml来表示字符代码”-这是一个数字。十六进制与十进制仅在将其转换为字符串时才起作用,并且根本没有要求。
乔恩·斯基特

1
您认为发布指向C#的链接以及一些C#代码如何帮助操作员解决Java问题?
Ferrybig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.