我觉得这很可能是复制品,但我找不到。
注意:我的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字符串,是这个问题的先决条件。
1条答案
按热度按时间ukxgm1gy1#
java
byte
是有符号的,这就是负数的来源。在两种语言中,数字的位值是相同的,它们的表示方式是不同的。通过使用Byte.toUnsignedInt()
:打印内容: