【问题标题】:JAVA: get UTF-8 Hex values from a string?JAVA:从字符串中获取 UTF-8 十六进制值?
【发布时间】:2012-03-31 04:43:16
【问题描述】:

我希望能够将原始 UTF-8 字符串转换为十六进制字符串。 在下面的示例中,我创建了一个包含 2 个字母的示例 UTF-8 字符串。 然后我试图获取十六进制值,但它给了我负值。

我怎样才能让它给我05D005D1

String a = "\u05D0\u05D1";
byte[] xxx = a.getBytes("UTF-8");

for (byte x : xxx) {
   System.out.println(Integer.toHexString(x));
}

谢谢。

【问题讨论】:

    标签: java utf-8 hex converter


    【解决方案1】:

    如果您想要代码点,请不要转换为 UTF-8 之类的编码。使用Character.codePointAt

    例如:

    Character.codePointAt("\u05D0\u05D1", 0) // returns 1488, or 0x5d0
    

    【讨论】:

    • 好吧,你想要 UTF-8 (0xD790) 或代码点 (0x000005D0) 的十六进制值吗?如果您想要代码点,请将字节转换为带有new String(bytes, "UTF-8") 的字符串,然后使用Character.codePointAt(...).toHexString() 获取十六进制表示。
    • 也许我错过了什么。 Character.codePointAt 没有 toHexString 方法,它返回一个整数。你能给我完整的例子吗?谢谢
    • 糟糕,toHexString 是一个静态方法。 System.out.println(Integer.toHexString(Character.codePointAt("\u05D0", 0))) 将打印出 5d0。如果你想在左边用零填充,试试System.out.printf("%08x", Character.codePointAt("\u05D0", 0)),它会打印000005d0
    • 像魅力一样工作。谢谢。
    【解决方案2】:

    出现负值是因为byte 的范围是-128 到127。以下代码将产生正值:

    String a = "\u05D0\u05D1";
    byte[] xxx = a.getBytes("UTF-8");
    
    for (byte x : xxx) {
        System.out.println(Integer.toHexString(x & 0xFF));
    }
    

    主要区别在于它输出x & 0xFF 而不仅仅是x,此操作将byte 转换为int,去掉符号。

    【讨论】:

    • 感谢您的快速回复,但它仍然没有给出正确的值。我试图重现 05D0 的十六进制值,代码给了我 d7 90
    • @thedp 发生这种情况是因为您编码的符号在 UTF-8 中由这些字节表示。如果你想接收你说的字节,你应该使用 UTF-16。
    • UTF-8 编码不会像我怀疑的那样做。每个值都在多个字节上编码。详情请见en.wikipedia.org/wiki/UTF-8#Description
    • 没错。二进制的 D7 90 是 11010111 10010000。这里第一个字节开头的 110 只是表示将有下一个字节。第二个字节开头的 10 表示它不是第一个字节。如果我们删除它们,我们会得到以下数字 10111 010000,它正好是十六进制的 5D0。这就是 UTF-8 中的解码过程。
    • 感谢您向我解释这个话题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2014-08-07
    • 2020-10-26
    • 2015-04-28
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多