Java字符转换为其Unicode十六进制字符串表示形式以及相反方向的转换

18

我需要将Java字符的十六进制代码转换成字符串,并稍后再次解析这些字符串。我在这里发现可以按照以下方式执行解析:

char c = "\u041f".toCharArray()[0];

我希望有像Integer.valueOf()这样更优雅的方式进行解析。

怎么样才能正确地生成十六进制unicode呢?


我发布了一个答案,但我觉得我可能是按照你想要的相反方向做的。你能否举个例子说明一下你想要的输出? - noel
比如说,对于字符ö,我想要的编码是'00F6',可以在这里找到:http://en.wikipedia.org/wiki/List_of_Unicode_characters。 - Jérôme Verstrynge
好的,那么我的答案应该有效。 - noel
3个回答

18

这将生成字符的十六进制字符串表示:

char ch = 'ö';
String hex = String.format("%04x", (int) ch);

这将把十六进制字符串转换回 char:

int hexToInt = Integer.parseInt(hex, 16);
char intToChar = (char)hexToInt;

第一个给我的是>无法从char []转换为int - Machado
@Holmes,我使用openjdk 1.8.0_65和javac 1.8.0_60没有任何问题。可以使用上述方法或char c = '\u041f';(即П)或\u4e2d'(即中)。但是我无法编译麻将牌''(它超出了基本多语言平面,因此不能由char表示,所以这并不奇怪)。 - Eponymous

7

经过深入阅读,javadoc表明基于char参数的Character方法并不支持所有Unicode值,但是那些使用代码点(即int)的方法可以。

因此,我一直在执行以下测试:

    int codePointCopyright = Integer.parseInt("00A9", 16);

    System.out.println(Integer.toHexString(codePointCopyright));
    System.out.println(Character.isValidCodePoint(codePointCopyright));

    char[] toChars = Character.toChars(codePointCopyright);
    System.out.println(toChars);

    System.out.println();

    int codePointAsian = Integer.parseInt("20011", 16);

    System.out.println(Integer.toHexString(codePointAsian));
    System.out.println(Character.isValidCodePoint(codePointAsian));

    char[] toCharsAsian = Character.toChars(codePointAsian);
    System.out.println(toCharsAsian);

我得到的结果是:

在此输入图片描述

因此,在我的问题中,我不应该谈论char,而应该谈论char数组,因为Unicode字符可以用多个char表示。另一方面,一个int可以涵盖所有内容。


你在问题中谈到 char 是正确的,Java 强制程序员在编码细节层面上与 Unicode 补充字符的字符串打交道,这是 Java 的问题。 - Basel Shishani
@BaselShishani Java并没有“破损”。当Java首次推出时,Unicode还没有补充平面,一个char可以处理任何Unicode代码点。各种编码和Java基元之间的转换有时确实会令人困惑,但高效地表示世界上所有语言(以及更多)的所有字符本质上是复杂的,而Unicode仍在不断发展。在处理Unicode数据的复杂性方面,有一点是您不能也不应该掩盖用户。不要因此责怪Java。 - skomisa

5

在字符串级别上:以下使用的是int而不是char,比如对于中文来说,但对于字符也是合适的。

    int cp = "\u041f".codePointAt(0);
    String s = new String(Character.toChars(cp));

在native2ascii级别上: 如果您想在\uXXXX和Unicode字符之间进行转换,请使用apache,commons-lang中的StringEscapeUtils

    String t = StringEscapeUtils.escapeJava(s + "ö");
    System.out.println(t);

在命令行中,native2ascii 可以在 u-escaped 和 UTF-8 之间进行文件转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接