UTF-8字符串至序数值:等效于Java的Python输出

时间:2019-02-04 15:18:06

标签: java python utf-8 byte utf

我觉得这很可能是重复的,但我找不到它。

注意:我的Python知识非常有限,所以我不确定100%如何在Python中完成字符串,字节和编码。我对编码的总体了解也不是很多。

假设我们有字符串"Aä$$€h"。它包含三个不同的普通ASCII字符(A$h)和两个非ASCII字符(ä€)。在Python中,我们有以下代码:

# coding: utf-8
input = u'Aä$$€h'
print [ord(c) for c in input.encode('utf-8')]
# Grouped per character:
print [[ord(x) for x in c.encode('utf-8')] for c in input_code]

将输出:

[65, 195, 164, 36, 36, 226, 130, 172, 104]
[[65], [195, 164], [36], [36], [226, 130, 172], [104]]

Try it online.

现在,我正在寻找提供相同整数数组的Java等效项。我知道默认情况下,Java中的所有字符串都是使用UTF-16编码的,只有字节数组才能具有实际的编码。我以为下面的代码可以得到我期望的结果:

String input = "Aä$$€h";
byte[] byteArray = input.getBytes(java.nio.charset.StandardCharsets.UTF_8);
System.out.println(java.util.Arrays.toString(byteArray));

但不幸的是,它给出了以下结果:

[65, -61, -92, 36, 36, -30, -126, -84, 104]

Try it online.

我不确定这些负值来自何处。

所以我的问题主要是这个:

给出Java中包含非ASCII字符(即"Aä$$€h")的字符串,输出其有序UTF-8整数,类似于Python ord函数在UTF-8编码字节上的输出。该问题的第一部分是已经存在Java字符串,这是该问题的前提。

1 个答案:

答案 0 :(得分:3)

对Java byte进行签名,这就是负数的来源。按位数字在两种语言中具有相同的值,它们的表示方式只是不同。您可以使用Byte.toUnsignedInt()获得与python中相同的表示形式:

String input = "Aä$$€h";
byte[] byteArray = input.getBytes(java.nio.charset.StandardCharsets.UTF_8);
int[] ints = new int[byteArray.length];
for(int i = 0; i < ints.length; i++) {
    ints[i] = Byte.toUnsignedInt(byteArray[i]);
}
System.out.println(java.util.Arrays.toString(ints));

哪些印刷品:

[65, 195, 164, 36, 36, 226, 130, 172, 104]