UTF-8字符串序号值:相当于Java为Python输出

问题描述 投票:2回答:1

我有一种感觉,这是最有可能是重复的,但我无法找到它。

注:我的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字符串的第一部分,是这个问题的前提条件。

java python utf-8 byte utf
1个回答
3
投票

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]
© www.soinside.com 2019 - 2024. All rights reserved.