我希望能将一个原始的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));
}
谢谢。
我希望能将一个原始的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));
}
如果您想要得到代码点,请不要将其转换为像UTF-8这样的编码。使用Character.codePointAt。
例如:
Character.codePointAt("\u05D0\u05D1", 0) // returns 1488, or 0x5d0
出现负值是因为 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
,丢弃符号。
new String(bytes, "UTF-8")
将字节转换为字符串,然后使用Character.codePointAt(...).toHexString()
来获取十六进制表示。 - ataylorCharacter.codePointAt
没有toHexString
方法,它返回一个整数。你能否给我一个完整的例子?谢谢。 - thedpSystem.out.println(Integer.toHexString(Character.codePointAt("\u05D0", 0)))
将打印出5d0
。如果您想在左侧用零填充它,请尝试使用System.out.printf("%08x", Character.codePointAt("\u05D0", 0))
,它将打印000005d0
。 - ataylor