Регулярное выражение Python против кодировки символов Latin-1? - PullRequest
0 голосов
/ 26 августа 2010

У меня есть файл, который содержит (я считаю) кодировку латиницы-1.

Однако я не могу сопоставить регулярные выражения с этим файлом.

Если я кошку файл, он выглядит хорошо:

Однако я не могу найти строку:

In [12]: txt = open("b").read()

In [13]: print txt
  <Vw_IncidentPipeline_Report>


In [14]: txt
Out[14]: '\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'

In [22]: txt.find("Vw_IncidentPipeline_Report")
Out[22]: -1

In [23]: txt.decode("latin-1")
Out[23]: u'\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'

In [25]: txt.decode("utf-16le")
Out[25]: u'\u2000\u2000\u3c00\u5600\u7700\u5f00\u4900\u6e00\u6300\u6900\u6400\u6500\u6e00\u7400\u5000\u6900\u7000\u6500\u6c00\u6900\u6e00\u6500\u5f00\u5200\u6500\u7000\u6f00\u7200\u7400\u3e00\u0d00\u0a00'

Как мне успешно декодировать строку, чтобы я мог найти в ней строки?

Ответы [ 5 ]

3 голосов
/ 26 августа 2010

Это не Latin-1, это utf-16 big endian:

>>> txt = '\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'
>>> txt.decode("utf-16be")
u'  <Vw_IncidentPipeline_Report>\r\n'

так, просто расшифруй таким образом и живи долго и счастливо; -).

1 голос
/ 26 августа 2010

У вас неправильная кодировка. Попробуйте txt.decode("UTF-16BE")

Позволяет проверить с помощью iconv ...

>>> txt='\x00 \x00 \x00<\x00V\x00w\x00_\x00I\x00n\x00c\x00i\x00d\x00e\x00n\x00t\x00P\x00i\x00p\x00e\x00l\x00i\x00n\x00e\x00_\x00R\x00e\x00p\x00o\x00r\x00t\x00>\x00\r\x00\n'
>>> open("txt","w").write(txt)
>>> exit()
$ iconv -f utf-16be txt
  <Vw_IncidentPipeline_Report>

Нет, там нет японцев

0 голосов
/ 26 августа 2010

На самом деле это был UTF-18LE, поэтому я использовал:

iconv -f 'UTF-16LE//' -t utf-8 -c
0 голосов
/ 26 августа 2010

Может быть UTF-8. Какое у тебя регулярное выражение?

0 голосов
/ 26 августа 2010

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

...