【发布时间】:2011-01-01 16:02:06
【问题描述】:
假设我有这个:
char registered = '®';
或umlaut,或任何Unicode 字符。我怎样才能得到它的代码?
【问题讨论】:
假设我有这个:
char registered = '®';
或umlaut,或任何Unicode 字符。我怎样才能得到它的代码?
【问题讨论】:
只需将其转换为int:
char registered = '®';
int code = (int) registered;
事实上,存在从 char 到 int 的隐式转换,因此您不必像我在上面所做的那样明确指定它,但在这种情况下我会这样做以明确您的身份努力去做。
这将给出 UTF-16 代码单元 - 这与基本多语言平面中定义的任何字符的 Unicode 代码点相同。 (并且只有 BMP 字符可以在 Java 中表示为 char 值。)正如 Andrzej Doyle 的回答所说,如果您想要来自任意字符串的 Unicode 代码点,请使用 Character.codePointAt()。
一旦您获得了 UTF-16 代码单元或 Unicode 代码点,它们都是整数,您可以自行决定如何处理它们。如果你想要一个字符串表示,你需要确切地决定你想要什么样的 kind 表示。 (例如,如果您知道该值将始终在 BMP 中,您可能需要一个固定的 4 位十六进制表示,前缀为 U+,例如 "U+0020" 表示空格。)但这超出了这个问题的范围,因为我们不知道要求是什么。
【讨论】:
char,它代表U+FFFF 之下的一个Unicode 字符,但不适用于每个Unicode 字符,因为char 不能代表所有Unicode。根据您的char 的来源,您可能需要做一些更复杂的事情(并且真的应该为此做好准备)。
Integer#toHexString()。
char开头,但是你可以用char.Convert.ToUtf32。
一种更完整但更冗长的方法是使用Character.codePointAt 方法。这将处理“高代理”字符,这些字符不能由 char 可以表示的范围内的单个整数表示。
在您给出的示例中,这不是绝对必要的 - 如果(Unicode)字符可以放入单个(Java)char(例如 registered 局部变量),那么它必须在 @ 987654326@ 到 \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(registered)”按我想要的方式工作:
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 artifact 获取或从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
希望对你有帮助
【讨论】:
//下面可以获取unicode
int a = 'a'; // 'a' 是你想要获取其 unicode 的字母或符号
//你可以通过它的unicode获取下面的符号或字母
System.out.println("\123"); //123是你要传输的unicode
【讨论】: