2010-04-13 7 views
1

J'utilise Perl pour lire les fichiers UTF-16LE dans Windows 7.Pourquoi lire dans fichier UTF-16LE ne convertira pas " r n" Dans " n" Dans Windows

Si je lis dans un fichier ASCII avec le code suivant alors chaque "\ r \ n" dans le fichier sera converti en un "\ n" en mémoire:

open CUR_FILE, "<", $asciiFile; 

Si je lis dans un UTF-16LE (windows 1200) fichier avec le code suivant , cette incohérence provoque des problèmes lorsque j'essaie d'écrire des lignes avec des sauts de ligne.

open CUR_FILE, "<:encoding(UTF-16LE)", $utf16leFile; 

Ensuite, "\ r \ n" restera inchangé.

Mise à jour:
Pour chaque ligne d'un fichier UTF-16LE:

line =~ /(.*)$/ 

Ensuite, la chaîne correspond à 1 $ comprendra un "\ r" à la fin ...

+0

Cela ressemble à un bug pour moi. Autant que je m'en souvienne, Perl est censé garantir que '\ n' fonctionne pour une correspondance de nouvelle ligne pour les choses codées en interne. Définitivement pour d'autres encodages sur Windows. –

+0

Quelle version de Perl utilisez-vous? Si ce n'est pas 5.10.1 (ou 5.12.RCn), alors pouvez-vous passer à une version plus récente? –

+0

J'utilisais 5.10.0, mais après la mise à niveau vers la version 5.10.1, le problème persiste (Windows 64bit) –

Répondre

1

Quelle version de Perl utilisez-vous? La manipulation UTF-16 et CRLF ne s'est pas bien mélangée avant 5.8.9 (Unicode changes in 5.8.9). Je ne suis pas sûr à propos de 5.10.0, mais cela fonctionne dans 5.10.1 et 5.8.9. Vous devrez peut-être utiliser lors de l'ouverture du fichier.

+0

"<: encoding (UTF-16LE): crlf" ne fonctionne pas non plus, même avec la version 5.10.1 –

+0

@cjm apparaît cassé dans mes tests sur 5.10. 1 aussi (bien que je ne sois pas sur windows, je fais juste semblant avec 'PERLIO = crlf' :) – hobbs

+0

' "<: encoding (UTF-16LE): crlf" 'fonctionne vraiment pour moi (sur Linux) avec à la fois 5.8.9 et 5.10.1. J'ai seulement 5.8.8 sur Windows, et cela ne fonctionne pas. – cjm

0

Ce sont des fenêtres qui exécutent cette magie pour vous .... Si vous spécifiez UTF c'est l'équivalent de l'ouverture du fichier en mode binaire vs texte.

Les nouvelles versions de Perl ont le \ R qui est une nouvelle ligne générique (ie, va correspondre à la fois \ r \ n et \ n) ainsi que \ v qui correspondra à toutes les notions OS et Unicode des espaces verticaux. , \ r \ n \ r \ n espace insécable, etc)

Est-ce que la logique regex permet d'utiliser \ R au lieu de \ n?

+0

Je viens d'utiliser $ comme ancre de la fin de ligne –

Questions connexes