2016-01-07 1 views
0

J'écris un petit programme dans ruby, qui modifie essentiellement certains fichiers dans un fichier zip. Le fichier zip est spécifié en tant que paramètre sur la ligne de commande et interprété via le OptionParser.Problèmes d'encodage avec ruby ​​lors de la lecture des arguments de la ligne de commande avec optparse

Le problème est que, lors de la spécification d'un fichier contenant des caractères non-ascii, le fichier ne peut pas être ouvert, indiquant qu'il n'a pu être trouvé. Ce problème se produit en utilisant cmd.exe sous Windows.

Voici un exemple minimal:

# example.rb 
require "zip" 
require "optparse" 

zip_file_name = String.new 

# read and interprete command line arguments: 
OptionParser.new do |opts| 
    opts.on("-f", "--file FILE", String, "The zip-file, which will be modified") do |f| 
     zip_file_name = f 
    end 
end.parse! 

# Open the zip file: 
Zip::File.open(zip_file_name) do |zipfile| 
end 

Si vous créez un fichier zip test.zip et exécuter example.rb -f test.zip tout va bien (il ne se termine sans erreur). Faire la même chose avec un fichier zip täst.zip me donne une erreur. J'ai essayé de faire zip_file_name.encode!(Encoding::UTF_8), mais cela n'a pas résolu le problème.

Cela semble être un problème d'encodage (l'encodage de zip_file_name est cp850) mais le transcodage ne semble pas fonctionner correctement. Donc, ma question serait: Comment puis-je changer mon programme pour permettre également les caractères non-ascii pour spécifier les fichiers sur la ligne de commande? L'ajout de zip_file_name.force_encoding(Encoding::Windows_1252) avant d'ouvrir le fichier résout le problème (sur Windows Europe de l'Ouest).

Répondre

0

Apparemment, le codage des noms de fichiers CP850 est une mauvaise hypothèse de la part de Ruby. Sur mon système Windows, il semble que les noms de fichiers sont codés dans Windows_1252 (une version personnalisée de Latin1 ou ISO 8859-1).

+0

Merci pour la réponse rapide - ça marche maintenant! Étrange, cependant, ce rubis suppose un mauvais encodage ... – SkWob