J'ai un tas de .txt que Notepad ++ dit (dans son menu déroulant "Encodage") sont "ANSI".
Ils contiennent des caractères allemands, [äöüß], qui s'affichent très bien dans Notepad ++.
Mais ils n'apparaissent pas en plein irb quand je File.read 'this is a German text example.txt'
leur.
Est-ce que quelqu'un sait quel argument je dois donner Encoding.default_external=
?
(Je suppose que ce serait la solution, non?)
Quand 'utf-8'
ou 'cp850'
, il lit le fichier "ANSI" avec "äöüß" dedans comme "\ xE4\xF6\xFC\xDF" ...
(S'il vous plaît, n'hésitez pas à mentionner des choses apparemment "évidentes" dans vos réponses; je suis à peu près aussi novice que vous pouvez l'être et je sais encore juste assez pour poser cette question.)
Ce qu'ils signifient est probablement ISO/IEC 8859-1 (alias Latin-1), ISO-8859-1, ISO/IEC 8859-15 (alias Latin-9) ou Windows-1252 (alias CP 1252). Tous les 4 ont le ä
en position 0xE4
.
J'ai trouvé la réponse à cette question sur le Notepad ++ Forum, répondu en 2010 par CChris qui semble faire autorité.
Réponse:
Ce sera la page de codes système de votre ordinateur (page de codes 0).
Plus d'informations:
Affichez votre page de codes actuelle.
>help chcp
Displays or sets the active code page number.
CHCP [nnn]
nnn Specifies a code page number.
Type CHCP without a parameter to display the active code page number.
>chcp
Active code page: 437
Identifiants de la page de codes
Identifier .NET Name Additional information
437 IBM437 OEM United States
Je pense que c'est 'cp1252', alias 'windows-1252'.
Après avoir lu la réponse de Jörg, je suis retourné sur la page Encoding sur Ruby-doc.org en essayant de trouver des références aux encodages spécifiques qu'il a mentionnés, et c'est là que j'ai repéré le Encodings.aliases
méthode.
J'ai donc compliqué la méthode à la fin de cette réponse.
Ensuite, j'ai regardé la sortie dans notepad ++, la regardant à la fois comme 'ANSI' et utf-8, et j'ai comparé cela à la sortie dans irb ...
Je ne pouvais trouver que deux endroits dans la sortie irb où le fichier utf-8 était tronqué exactement de la même manière qu'il apparaissait dans notepad ++ lors de sa visualisation en tant que 'ANSI', et ces endroits étaient pour cp1252 et cp1254.
cp1252 est apparemment mon encodage "système de fichiers", donc je vais avec ça.
J'ai écrit un script pour faire des copies de tous les fichiers convertis en utf-8, en essayant à la fois de 1252 et 1254.
jusqu'à présent, les expressions rationnelles utf-8 semblent fonctionner avec les deux ensembles de fichiers.
Maintenant, je dois essayer de me souvenir de ce que j'essayais réellement d'accomplir avant de rencontrer tous ces maux de tête d'encodage. xD
def compare_encodings file1, file2
file1_probs = []
file2_probs = []
txt = File.open('encoding_test_output.txt','w')
Encoding.aliases.sort.each do |k,v|
Encoding.default_external=k
ename = [k.downcase, v.downcase].join " --- "
s = ""
begin
s << "#{File.read(file1)}"
rescue
s << "nope nope nope"
file1_probs << ename
end
s << "\t| #{ename} |\t"
begin
s << "#{File.read(file2)}"
rescue
s << "nope nope nope"
file2_probs << ename
end
Encoding.default_external= 'utf-8'
txt.puts s.center(58)
puts s.center(58)
end
puts
puts "file1, \"#{file1}\" exceptions from trying to convert to:\n\n"
puts file1_probs
puts
puts "file2, \"#{file2}\" exceptions from trying to convert to:\n\n"
puts file2_probs
txt.close
end
compare_encodings "utf-8.txt", "np++'ANSI'.txt"