Python конвертировать смешанный код ASCII в строку - PullRequest
0 голосов
/ 06 декабря 2010

Я получаю значение, заданное другим приложением, из memcached, используя библиотеку python-memcached. Но, к сожалению, это значение, которое я получаю:

>>> mc.get("key")
'\x04\x08"\nHello'

Можно ли проанализировать этот смешанный код ASCII в простую строку, используя функцию python?

Спасибо, куча за помощь

Ответы [ 2 ]

7 голосов
/ 06 декабря 2010

Это является «простой строкой» в той степени, в которой такая вещь существует.Я понятия не имею, какой вывод вы ожидаете, но:

Нет такого понятия, как простой текст .

Python (в 2.x, в любом случае) str type - это контейнер для байтов, а не символов.Во-первых, это не совсем текст :) Он отображает байты в очень простом кодировании, используя escape-последовательность для представления каждого байта, который даже немного «странный».Он снова будет отформатирован иначе, если вы print строка (сейчас вы видите синтаксис для создания такой литеральной строки в вашем коде).

В более простые времена мы наивно полагали, что могли быпросто сопоставьте байты с этими символами, которые мы называем «символами», и это было бы так.Затем оказалось, что существует примерно миллион различных отображений, которые люди хотели использовать, и многим из них нужно больше символов, чем может представить байт.Вот почему у нас теперь есть Unicode: он представляет каждый символ, который вам может понадобиться для любого реального языка (и несколько для поддельных языков и других целей), и абстрактно присваивает номера этим символам, но не сказать, как собрать и интерпретировать байты как числа.(Такова цель кодирования).

Если вы знаете, что строковые данные кодируются определенным образом, вы можете декодировать их в строку Unicode.Это может быть либо кодировка фактических данных Unicode, либо это может быть другой формат (например, японский текст часто встречается в чем-то, называемом «Shift-JIS», потому что он имеет для них примерно такое же значение, как и «Latin-1 "- общее расширение ASCII - делает для нас).В любом случае, вы получаете представление в памяти ряда кодовых точек Unicode (числа, упомянутые в предыдущем абзаце).Это, на самом деле, "текст", но на самом деле он не "простой":)

Но похоже, что данные, которые вы имеете, на самом деле представляют собой двоичный двоичный блок байтов, который просто случается, состоит в основном из "читаемого текста", если интерпретируется как ASCII.

Что вам действительно нужно сделать, это выяснить почему первый байт имеет значение 4 иследующий байт имеет значение 8 и действует соответствующим образом.

1 голос
/ 06 декабря 2010

Если вам просто нужно обрезать '\x04\x08"\n', и он всегда один и тот же (вы не очень четко сформулировали свой вопрос, я не уверен, что это именно так или вы хотите), сделайте что-то подобное:

to_trim = '\x04\x08"\n'
string = mc.get('key')
if string.startswith(to_trim):
    string = string[len(to_trim):]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...