probleme de lecture d'yn fichier texte.

Aucune réponse
Avatar
kurtz le pirate
bonjour,

j'ai un fichier texte (convertion pdf/texte faite avec automator) que
j'ai du mal à lire.

le dump du début du fichier donne :
00000000: FF FE 4C 00 6F 00 6F 00 ..L.o.o.
00000008: 6B 00 69 00 6E 00 67 00 k.i.n.g.
00000010: 20 00 66 00 6F 00 72 00 .f.o.r.
00000018: 20 00 52 00 65 00 61 00 .R.e.a.
00000020: 6C 00 20 00 45 00 78 00 l. .E.x.
...

il semblere donc que se soit du 'UTF-16 Little Endian' puisque le
fichier commence avec FF FE.

je lis le fichier de cette manière :

open(FH, "< :encoding(UTF-16)", $fileName)
or die "Error openning $fileName: $!\n";
while (<FH>) {
chomp;
print ">>$_\n";
}

ce qui donne :
>>Looking for Real Exam Questions for IT Certification Exams!
We guarantee you can pass any IT certification exam at your first
attempt with just 10-12
hours study of our guides.
Our study guides contain actual exam questions, you will get word to
word same on your actual test; accurate answers with detailed
explanation verified by experts and all graphics and drag-n-drop
exhibits shown just as on the real test.
To test the quality of our guides, you can download the one-fourth
portion of any guide from http://www.certificationking.com absolutely free.
...

à chaque boucle, plusieurs lignes sont lues dans le fichier.
le CR semble ignoré. pourtant le dump montre bien un CR(0x0D) à la fin
de chaque ligne :

00000070: 61 00 6D 00 73 00 21 00 a.m.s.!.
00000078: 0D 00 57 00 65 00 20 00 ..W.e. .
^^
donc, comment ligne ligne par ligne un fichier en UTF-16 ?



autre problème, à l'execution du perl, il y a des tas d'erreur du genre:

Wide character in print <FH> line X.
perl n'aime pas certain caracteres ?



merci d'avance de votre aide.


---
Kurtz le pirate
Compagnie de la Banquise

10 réponses

1 2
Avatar
Francois Lafont
Bonsoir,

Juste pour info, je n'ai pas de problème pour lire un fichier
utf-16 LE sur ma Debian Wheezy avec Perl 5.14.2 et avec ce bout
de code (test.pl) :

---------------------------------------------------
#!/usr/bin/perl

use strict;
use warnings;
binmode(STDOUT, ':encoding(UTF-8)');

for my $filename (@ARGV) {

open(FH, "< :encoding(UTF-16)", $filename)
or die "Error when openning $filename: $!n";

while (<FH>) {
chomp;
print ">>$_n";
}

}
---------------------------------------------------

Je me suis aidé de cette page là :
http://www.perlmonks.org/?node_idq9216

Voici un copier-coller de mon terminal :

$ hexdump -C text.txt
00000000 ff fe 4f 00 68 00 20 00 6c 00 65 00 20 00 62 00 |..O.h. .l.e. .b.|
00000010 65 00 6c 00 20 00 e9 00 6c 00 e9 00 70 00 68 00 |e.l. ...l...p.h.|
00000020 61 00 6e 00 74 00 0d 00 0a 00 4f 00 68 00 20 00 |a.n.t.....O.h. .|
00000030 6c 00 65 00 20 00 62 00 65 00 6c 00 20 00 e9 00 |l.e. .b.e.l. ...|
00000040 6c 00 e9 00 70 00 68 00 61 00 6e 00 74 00 0d 00 |l...p.h.a.n.t...|
00000050 0a 00 0d 00 0a 00 |......|
00000056

$ file -i text.txt
text.txt: text/plain; charset=utf-16le

$ ./test.pl text.txt > out

$ file -i out
out: text/plain; charset=utf-8

$ od -c out
0000000 > > O h l e b e l 303 251 l 303
0000020 251 p h a n t r n > > O h l e
0000040 b e l 303 251 l 303 251 p h a n t r n
0000060 > > r n
0000064

--
François Lafont
Avatar
Olivier Miakinen
Bonjour,

Je ne connais pas (encore) perl et je ne suis pas sur Macintosh, mais
peut-être que cette observation pourra être utile :

Le 02/06/2014 02:05, Francois Lafont répondait à kurtz le pirate :

Juste pour info, je n'ai pas de problème pour lire un fichier
utf-16 LE sur ma Debian Wheezy avec Perl 5.14.2 et avec ce bout
de code (test.pl) :

[...]

$ hexdump -C text.txt
00000000 ff fe 4f 00 68 00 20 00 6c 00 65 00 20 00 62 00 |..O.h. .l.e. .b.|
00000010 65 00 6c 00 20 00 e9 00 6c 00 e9 00 70 00 68 00 |e.l. ...l...p.h.|
00000020 61 00 6e 00 74 00 0d 00 0a 00 4f 00 68 00 20 00 |a.n.t.....O.h. .|


^^^^^ ^^^^^

Ton fichier, lu sur Linux, contient 0d 00 suivi de 0a 00 (CR + LF)
alors que le fichier de kurtz le pirate, qui est sur Mac, ne contient
que 0D 00 (CR seul).

Cordialement,
--
Olivier Miakinen
Avatar
Nicolas George
kurtz le pirate , dans le message
<538896ab$0$2048$, a écrit :
à chaque boucle, plusieurs lignes sont lues dans le fichier.
le CR semble ignoré. pourtant le dump montre bien un CR(0x0D) à la fin
de chaque ligne :



Le caractère CR n'a aucune signification particulière pour la délimitation
des lignes. Tu confonds avec LF.
Avatar
Paul Gaborit
À (at) 02 Jun 2014 07:41:25 GMT,
Nicolas George <nicolas$ écrivait (wrote):

kurtz le pirate , dans le message
<538896ab$0$2048$, a écrit :
à chaque boucle, plusieurs lignes sont lues dans le fichier.
le CR semble ignoré. pourtant le dump montre bien un CR(0x0D) à la fin
de chaque ligne :



Le caractère CR n'a aucune signification particulière pour la délimitation
des lignes. Tu confonds avec LF.



Quelle drôle d'affirmation ! Il semble que vous n'avez jamais travaillé
avec un Mac. Lisez le début de 'perlport' pour en savoir plus...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
espie
Par contre, un fichier en UTF16 avec des CR comme fin de ligne, c'est
original. Me semblait que cette horreur d'UTF16 etait restee cantonnee a
Windows ? mais peut-etre me trompe-je et rencontre-t-on ca aussi sur mac.
Avatar
Nicolas George
Paul Gaborit , dans le message ,
a écrit :
Quelle drôle d'affirmation ! Il semble que vous n'avez jamais travaillé
avec un Mac.



Un OS pourri mort depuis le siècle dernier ? En effet, ça inexiste.
Avatar
Paul Gaborit
À (at) 02 Jun 2014 11:50:27 GMT,
Nicolas George <nicolas$ écrivait (wrote):

Paul Gaborit , dans le message ,
a écrit :
Quelle drôle d'affirmation ! Il semble que vous n'avez jamais travaillé
avec un Mac.



Un OS pourri mort depuis le siècle dernier ? En effet, ça inexiste.



Du troll bien velu ? Ou alors votre expérience sur Mac date du siècle
dernier...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Nicolas George
Paul Gaborit , dans le message ,
a écrit :
Du troll bien velu ? Ou alors votre expérience sur Mac date du siècle
dernier...



Le pseudo-Unix qu'apple fourgue de nos jours utilise LF comme séparateur de
lignes.
Avatar
Paul Gaborit
À (at) 02 Jun 2014 21:03:49 GMT,
Nicolas George <nicolas$ écrivait (wrote):

Paul Gaborit , dans le message ,
a écrit :
Du troll bien velu ? Ou alors votre expérience sur Mac date du siècle
dernier...



Le pseudo-Unix qu'apple fourgue de nos jours utilise LF comme séparateur de
lignes.



C'est un Unix (pas plus pseudo que n'importe quel Linux ou *BSD) qui
utilise LF seul. Mais il y aussi de nombreux progammes en GUI qui
continuent à utiliser le CR seul. Au passage, rien ne l'interdit même en
dehors d'un Mac. C'est une convention comme une autre pour un fichier
texte.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
Nicolas George
Paul Gaborit , dans le message ,
a écrit :
C'est un Unix (pas plus pseudo que n'importe quel Linux ou *BSD)



Assez peu respectueux des standards, à part quand apple graisse les rouage
des comités de certification. Et absolument pas respectueux des usages.

Au passage, rien ne l'interdit même en
dehors d'un Mac. C'est une convention comme une autre pour un fichier
texte.



Non. Un fichier texte au sens Unix, et partant au sens Perl, est formé de
lignes (de moins de 1024 caractères) terminées par LF. C'est spécifiquement
défini. Les applications standard de la toolbox Unix ne sont pas tenues
d'être capables de digérer quoi que ce soit d'autres, même si c'est
évidemment mieux qu'elles le soient.
1 2