UTF-8 строка к порядковому значению: эквивалент Java для вывода Python - PullRequest
0 голосов
/ 04 февраля 2019

У меня такое ощущение, что это, скорее всего, дубликат, но я не могу его найти.

ПРИМЕЧАНИЕ: мои знания 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, является предварительным условием для этого вопроса.

1 Ответ

0 голосов
/ 04 февраля 2019

Java byte подписано, отсюда и отрицательные числа.Битовые числа имеют одинаковое значение на обоих языках, способ их представления просто различен.Вы можете получить то же представление, что и в python, используя 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]
...