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 字符串。 然后我试图获取十六进制值,但它给了我负值。
我怎样才能让它给我05D0和05D1
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 之间的转换
如何将包含 UTF-8 十六进制值的字符串转换为 C 中的 wchar?