Найти - Пользователи
Полная версия: Проблема с декодированием.
Начало » Python для новичков » Проблема с декодированием.
1
aspe
Есть некий файл aword.txt в нем есть строка.
\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc
есть скрипт aw.py
#!/usr/bin/python
import chardet, os
f = open ("aword.txt", "r")
for line in f:
print chardet.detect(line)
b = line.decode('cp1251')
print b

>>{'confidence': 1.0, 'encoding': 'ascii'}
>>\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc
Проблема состоит в том что chardet.detect(line) определяет строку как ascii.
Если скрипт изменить на:
#!/usr/bin/python
import chardet, os
line = "\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc"
print chardet.detect(line)
b = line.decode('cp1251')
print b

>>{'confidence': 0.98999999999999999, 'encoding': 'windows-1251'}
>>как+позвонить
то все нормально определяется chardet.detect(line) определяет строку как cp1251.
Почему при чтении из файл, строка в переменной определяется как ascii, а когда явно ее задать в скрипте то определяется как cp1251. Как решить эту проблему.
Александр Кошелев
У вас получаются разные строки. В файле лежать байты со значения в виде символов ‘\’, ‘x’, ‘e’ и т.д. Это конечно же ascii.

А вот это
line = "\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc"
уже не простая строка, поскольку символ ‘\x’ является эскейп последовательность, говорящей что следующие 2 символа это hex значение, то интерпретируются питоном как символы в некой кодировке, которая уже cp1251.

Если вы перед строковым литералом ставите символ ‘r’, вот так
line = r"\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc"
то тоже получите ascii.
aspe
Спасибо за ответ.
Если ли готовый метод, который сможет строку “\xea\xe0\xea+\xef\xee\xe7\xe2\xee\xed\xe8\xf2\xfc”
преобразовать в хекс-эскейп формат?
Александр Кошелев
Вам нужно байты прочтенные из файла превратить в питонячью строку, например так:

line = line.decode('string_escape')
aspe
Еще раз спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB