2010-08-25 7 views
0

J'ai un fichier qui contient (je crois) un codage latin-1.regex Python contre l'encodage de caractères Latin-1?

Cependant, je ne peux pas faire correspondre les expressions rationnelles avec ce fichier.

Si je chat le fichier, il semble bien:

Cependant, je ne peux pas trouver la chaîne:

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' 

Comment puis-je décode avec succès la chaîne, donc je peux trouver des chaînes dans ce?

+0

Y at-il un marque de l'ordre des octets («\ xff \ xfe» ou «\ xfe \ xff») au début du fichier? –

+0

À moins que l'OP ait édité la transcription ci-dessus, le fichier est de toute évidence (a) codé en UTF-16BE (b) n'a pas de nomenclature au début. –

Répondre

-1

Vous pouvez essayer le module chardet pour voir si votre problème concernant l'encodage est correct.

+0

Vous n'avez évidemment pas essayé. 'chardet' est documenté pour fonctionner avec UTF-16xE avec une nomenclature, pas autrement. Voici le résultat de l'essayer: >>> chardet.detect (txt) {'confidence': 1.0, 'encoding': 'ascii'} >>> –

+0

Qu'est-ce qu'une «nomenclature»? –

+0

Octet Ordre d'octet: Unicode peut être codé sous la forme d'entiers 16 bits ou 32 bits. Vous devez donc indiquer quel codage est utilisé – Mermoz

0

Peut être UTF-8. Quelle est votre regex?

+1

Nah, pas avec tous les' \ x00's, ne pouvait pas être utf-8. Jamais vu un codage plus gros UTF-16 big endian, selon ma réponse. –

+1

Techniquement, les données * sont * valides UTF-8. Mais qui écrit des fichiers avec des caractères alternatifs U + 0000 et ASCII? – dan04

3

Il est pas Latin-1, il est 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' 

donc, juste décodent cette façon et vivre heureux pour toujours ;-).

+1

Vous ne voulez pas dire "Ce n'est pas Latin-1"? – Bob

+0

En fait, je pense que c'est utf-16le. iconv avec utf-16be a donné le japonais. –

+0

@Joseph, avez-vous utilisé iconv avec les codes d'échappement python dans le fichier? Si vous utilisez iconv, vous devez remplacer le '\ x00' par' NUL' octets –

1

Vous avez un mauvais encodage. Essayez txt.decode("UTF-16BE")

permet de vérifier avec 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> 

Nope, pas japonais là-bas

+0

En fait, je pense que c'est utf-16le. iconv avec utf-16be a donné le japonais. –

+0

@Joseph, iconv fonctionne bien pour moi. Pouvez-vous nous montrer ce que vous avez fait pour obtenir le japonais? –

-1

En fait, il était UTF-18LE, donc j'utilisé:

iconv -f 'UTF-16LE//' -t utf-8 -c