Преобразование строк python - PullRequest
1 голос
/ 18 июня 2020

У меня небольшой вопрос о преобразовании строк в python3.

s = '\x001\x002\x001\x000\x005\x005\x000\x004\x000\x000\x00'

print (s) -> дает результат:

1 2 1 0 5 5 0 4 0 0

Однако, когда я пытаюсь преобразовать строку, используя следующее:

bytes(s, 'utf16').decode('utf16'), я получаю '\ x001 \ x002 \ x001 \ x000 \ x005 \ x005 \ x000 \ x004 \ x000 \ x000 \ x00 '.

Как можно программно получить тот же результат, что и print (s)?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

В первом примере вы печатаете строку s, и консоль игнорирует \x00. Вы вводите print(s).

В последней строке вы получаете строку из приглашения python. Если вы напечатаете это: print(bytes(s,'utf-16').decode('utf-16')), вы получите то, что хотите.

Итак, подсказка Python покажет вам переменную с контекстом (например, вы также видите знаки '), но не настоящие представление строки (которая у вас есть с print).

ADDENDUM:

print напечатает строку в своем аргументе, в конечном итоге вызывая str() для преобразования аргумента в строка. Но приглашение python напечатает представление переменной (заданное с помощью repr(). Таким образом, вы можете print(repr(bytes(s,'utf-16').decode('utf-16'))) получить ту же строку, что и в интерактивном сеансе python, но в виде строки. Вместо печати вы можете назначить такая функция (r = repr(bytes(...).decode(...)), значит, у вас r[0] это ', r[1] это \, et c.

1 голос
/ 18 июня 2020

Вам просто нужно декодировать этот двоичный файл, и вы получите ответ

x = b'\x001\x002\x001\x000\x005\x005\x000\x004\x000\x000\x00'
str1 = x.decode('utf-8')
print(" ".join([i for i in str1 if ord(i) != 0]))

Второе решение:

x = '1 2 1 0 5 5 0 4 0 0'
str_utf32 = x.encode('utf16')
print("Encoding :",str_utf32)
print("Decoding :",str_utf32.decode('utf16'))

вывод

Encoding : b'\xff\xfe1\x00 \x002\x00 \x001\x00 \x000\x00 \x005\x00 \x005\x00 \x000\x00 \x004\x00 \x000\x00 \x000\x00'
Decoding : 1 2 1 0 5 5 0 4 0 0
...