8字符串到序数值:相当于java的python输出

raogr8fs  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(356)

我觉得这很可能是复制品,但我找不到。
注意:我的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" ),输出与python类似的顺序utf-8整数 ord -函数对utf-8编码的字节执行。这个问题的第一部分,因为我们已经有了一个java字符串,是这个问题的先决条件。

ukxgm1gy

ukxgm1gy1#

java byte 是有符号的,这就是负数的来源。在两种语言中,数字的位值是相同的,它们的表示方式是不同的。通过使用 Byte.toUnsignedInt() :

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]

相关问题