2010-10-01 5 views
2

J'utilise ce petit peu de rubis:encodage de fichier générant un caractère vide dans ruby ​​- pourquoi?

File.open(ARGV[0], "r").each_line do |line| 
    puts "encoding: #{line.encoding}" 
    line.chomp.split(//).each do |char| 
    puts "[#{char}]" 
    end 
end 

Et j'ai un exemple de fichier que je l'alimentation dans le fichier ne contient que trois périodes et une nouvelle ligne.

Lorsque j'enregistre ce fichier avec un fileencoding de utf-8 (dans vim: set fileencoding=utf-8) et exécuter ce script là-dessus je reçois cette sortie:

encoding: UTF-8 
[] 
[.] 
[.] 
[.] 

Et si je change le fileencoding latin1 (dans vim: set fileencoding=latin1) et exécutez le script, je ne comprends pas que le premier caractère vide:

encoding: UTF-8 
[.] 
[.] 
[.] 

Qu'est-ce qui se passe ici? Je comprends que l'encodage utf8 met quelques octets au début du fichier pour marquer le fichier comme encodé en utf8, mais je pensais qu'ils étaient supposés être invisibles lors du traitement du texte (ie: le runtime ruby ​​était supposé les traiter). Qu'est-ce que je rate?

BTW:

ubuntu:~$ ruby --version 
ruby 1.9.2p0 (2010-08-18 revision 29034) [i686-linux] 

Merci!

Mise à jour:

dump Hex du fichier avec l'omble chevalier supplémentaire (la nomenclature):

ubuntu:~$ hexdump new.board 
0000000 bbef 2ebf 2e2e 0a0d 0a0d 
000000a 

Répondre

1

Essayez d'exécuter

data = IO.read(ARGV[0]) 
puts data.dump 

et de voir ce que vous obtenez. Cela imprimera les codes d'échappement de tous les caractères non imprimables.

Il ne ressemble pas à la UTF8 byte order mark, si je mets la nomenclature à l'aide :set bomb dans vim sur le fichier et votre code que je reçois

[?] 
[?] 
[?] 
[.] 
[.] 
[.] 

tandis que dump me donne

"\357\273\277...\n" 

qui sera la représentation octale de la nomenclature (EF BB BF en hexadécimal)

+0

Le fichier enregistré avec le codage de fichier utf8 dans vim a "\ u {feff} au début de la sortie data.dump, et le fichier latin1 n'a rien. –

+0

Donc, ce qui suggère que je suppose que ruby ​​traite les fichiers comme utf8 indépendamment de ce qui est sur le disque, et de traiter incorrectement la nomenclature? (c'est-à-dire: le traiter comme un char, plutôt qu'un indice d'encodage) –

+0

@Stewart - c'est la nomenclature utf-16, je ne sais pas pourquoi cela serait là. –

Questions connexes