probleme de lecture d'yn fichier texte.
Le
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: $!";
while (<FH>) {
chomp;
print ">>$_";
}
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
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: $!";
while (<FH>) {
chomp;
print ">>$_";
}
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
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
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 :
^^^^^ ^^^^^
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
Le caractère CR n'a aucune signification particulière pour la délimitation
des lignes. Tu confonds avec LF.
Nicolas George
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 - Perl en français -
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.
Un OS pourri mort depuis le siècle dernier ? En effet, ça inexiste.
Nicolas George
Du troll bien velu ? Ou alors votre expérience sur Mac date du siècle
dernier...
--
Paul Gaborit - Perl en français -
Le pseudo-Unix qu'apple fourgue de nos jours utilise LF comme séparateur de
lignes.
Nicolas George
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 - Perl en français -
Assez peu respectueux des standards, à part quand apple graisse les rouage
des comités de certification. Et absolument pas respectueux des usages.
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.