我有一个包含(我相信)latin-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'
如何成功解码字符串,以便在其中找到字符串?
答案 0 :(得分:3)
这不是拉丁文-1,它是utf-16大端:
>>> 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 :(得分:1)
您的编码错误。试试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>
不,没有日本人
答案 2 :(得分:0)
可能是UTF-8。什么是你的正则表达式?
答案 3 :(得分:-1)
您可以尝试使用模块chardet来查看有关编码的gess是否正确。
答案 4 :(得分:-1)
实际上,它是UTF-18LE,所以我用过:
iconv -f 'UTF-16LE//' -t utf-8 -c