JAVA:从字符串中获取 UTF-8 十六进制值?

Posted

技术标签:

【中文标题】JAVA:从字符串中获取 UTF-8 十六进制值?【英文标题】:JAVA: get UTF-8 Hex values from a string? 【发布时间】: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));

谢谢。

【问题讨论】:

【参考方案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 中的解码过程。 感谢您向我解释这个话题。

以上是关于JAVA:从字符串中获取 UTF-8 十六进制值?的主要内容,如果未能解决你的问题,请参考以下文章

Python 中 ISO-8859-2 和 UTF-8 之间的转换

使用正则表达式 C# 从字符串中获取十进制值

如何将包含 UTF-8 十六进制值的字符串转换为 C 中的 wchar?

Java中utf-8格式字符串的存储方法。

如何从 UTF-8 字符串的每个字符中获取 UNICODE 代码?

如何使用从 C++ 发送的地址在 python 中获取值?