假设我有这个:
char registered = '®';
或umlaut
,或任何unicode字符。我如何获得其代码?
Answers:
只需将其转换为int
:
char registered = '®';
int code = (int) registered;
实际上,存在从char
到的隐式转换,int
因此您不必像上面所做的那样显式地指定它,但是在这种情况下,我会这样做以使您清楚地知道要执行的操作。
这将提供UTF-16代码单元-与基本多语言平面中定义的任何字符的Unicode代码点相同。(只有BMP字符可以用char
Java表示为值。)正如Andrzej Doyle的回答所说,如果要从任意字符串中获取Unicode代码点,请使用Character.codePointAt()
。
一旦获得了UTF-16代码单元或Unicode代码点,但其中的整数是整数,则由您决定如何处理它们。如果你想要一个字符串表示,你需要决定什么样的你想要表示的。(例如,如果您知道该值始终在BMP中,则可能需要以开头的固定4位十六进制表示形式U+
,例如"U+0020"
用于空格。)但是,这超出了此问题的范围,因为我们不知道的要求是。
char
下面表示Unicode字符U+FFFF
的每个字符,但不适用于每个Unicode字符,因为char
不能表示所有Unicode。根据您的来源char
,您可能需要做一些更复杂的事情(并且确实应该为此做准备)。
Integer#toHexString()
。
char
,但是可以使用char.Convert.ToUtf32
。
一种更完整但更冗长的方法是使用Character.codePointAt方法。这将处理“高代理”字符,这些字符不能由a范围内的单个整数表示char
可以表示表示。
在示例中,您给出的代码并非绝对必要-如果(Unicode)字符可以放在单个(Java)内char
(例如registered
局部变量),则它必须在\u0000
to\uffff
范围内,并且您不需要担心代理对。但是,如果您正在从String / char数组中查看可能更高的代码点,则为了覆盖边缘情况,调用此方法是明智的。
例如,代替
String input = ...;
char fifthChar = input.charAt(4);
int codePoint = (int)fifthChar;
采用
String input = ...;
int codePoint = Character.codePointAt(input, 4);
在这种情况下,这不仅会减少一些代码,而且还会为您处理代理对的检测。
从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));
String.format("%x", (int) '€') == 0x20ac == '\u20ac'
对我来说,只有“ Integer.toHexString(已注册)”可以按照我想要的方式工作:
char registered = '®';
System.out.println("Answer:"+Integer.toHexString(registered));
该答案将仅为您提供表中通常显示的字符串表示形式。乔恩·斯基特(Jon Skeet)的答案进一步说明了这一点。
有一个开源库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)
亲爱的朋友,乔恩·斯凯特(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
希望对你有帮助