我觉得这很可能是重复的,但我找不到它。
注意:我的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]]
现在,我正在寻找提供相同整数数组的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]
我不确定这些负值来自何处。
所以我的问题主要是这个:
给出Java中包含非ASCII字符(即"Aä$$€h"
)的字符串,输出其有序UTF-8整数,类似于Python ord
函数在UTF-8编码字节上的输出。该问题的第一部分是已经存在Java字符串,这是该问题的前提。
答案 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]