Как сохранить байты в файл в двоичном режиме - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть похожий на байты объект, похожий на:

aa = b'abc\u6df7\u5408def.mp3'

Я хочу сохранить его в файл в двоичном режиме.коды приведены ниже, но не работают

if __name__=="__main__":
    aa = b'abc\u6df7\u5408def.mp3'
    print(aa.decode('unicode-escape'))

    with open('database.bin', "wb") as datafile:
        datafile.write(aa)

данные в файле выглядят так:

введите описание изображения здесь

но яхотите, чтобы правильный формат был таким, юникоды в двоичных данных:

введите описание изображения здесь

Как преобразовать байты, чтобы сохранить их в файл?

1 Ответ

0 голосов
/ 04 декабря 2018

\uNNNN экранирование не имеет смысла в байтовых строках, потому что они не определяют последовательность байтов.Кодовые точки Unicode являются концептуально абстрактными представлениями строк и не отображаются напрямую в формат сериализации (состоящий из байтов или, в принципе, любого другого вида конкретного символического представления).

Там являются четко определенные форматы сериализации для Unicode;они известны как «кодировки».Похоже, вы ищете кодировку этих символов UTF-16 с обратным порядком байтов.

aa = 'abc\u6df7\u5408def.mp3'.encode('utf-16-be')

С учетом этого, я считаю, что остальная часть вашего кода должна работать так, как ожидалось.

Unicode на диске всегда в кодировке, но вы, очевидно, должны знать кодировку, чтобы правильно его прочитать.Необязательная метка порядка байтов (BOM) иногда записывается в начало сериализованных текстовых файлов Unicode, чтобы помочь читателю обнаружить кодировку;это единственный непечатаемый символ, единственная цель которого - помочь устранить неоднозначность кодировки и, в частности, его порядок байтов (big-endian против little-endian).

Однако многие места стандартизированы в UTF-8который не требует спецификации.Само кодирование ориентировано на байты, поэтому оно не подвержено проблемам с порядком байтов.Возможно см. Также https://utf8everywhere.org/

...