Python - преобразование строк с широкими символами из двоичного файла в строки Python Unicode - PullRequest
5 голосов
/ 30 апреля 2010

Это был долгий день, и я немного озадачен.

Я читаю двоичный файл, который содержит много строк с широким символом, и я хочу вывести их как строки Unicode Python. (Для распаковки нестроковых данных я использую модуль struct, но я не делаю то же самое со строками.)

Например, читая слово «Серия»:

myfile = open("test.lei", "rb")
myfile.seek(44)
data = myfile.read(12)

# data is now 'S\x00e\x00r\x00i\x00e\x00s\x00'

Как я могу кодировать эти необработанные данные широких символов в виде строки Python?

Редактировать: я использую Python 2.6

Ответы [ 4 ]

8 голосов
/ 30 апреля 2010
>>> data = 'S\x00e\x00r\x00i\x00e\x00s\x00'
>>> data.decode('utf-16')
u'Series'
2 голосов
/ 14 ноября 2013

Я также рекомендую использовать rstrip с '\x00' после декодирования - чтобы удалить все '\x00' завершающие символы, если, конечно, они не нужны.

>>> data = 'S\x00o\x00m\x00e\x00\x20\x00D\x00a\x00t\x00a\x00\x00\x00\x00\x00'
>>> print '"%s"' % data.decode('utf-16').rstrip('\x00')
>>> "Some Data"

Без rstrip('\x00') результат будет с конечными пробелами:

>>> "Some Data  "
2 голосов
/ 27 мая 2011

Если известно, что рассматриваемая строка не имеет никаких символов помимо FF, еще одна возможность, которая генерирует строку, а не объект Unicode, путем исключения нулевых байтов:

>>> 'S\x00e\x00r\x00i\x00e\x00s\x00'[::2]
'Series'
0 голосов
/ 02 мая 2010

Хм, почему вы говорите, что «open» предпочтительнее «file»? Я вижу в ссылке (Python 2.5):

3.9 Файловые объекты Файловые объекты реализованы с использованием пакета stdio C и может быть создан с помощью встроенного файл конструктора (), описанный в раздел 2.1, `` Встроенный Функции. '' 3.6 ----- Сноска (3.6) file () является новой в Python 2.2. Более старая встроенная функция open () является псевдонимом для file ().

...