web-dev-qa-db-fra.com

L'encodage que Notepad ++ appelle simplement "ANSI", est-ce que quelqu'un sait comment l'appeler pour Ruby?

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.)

26
Owen_R

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.

12
Jörg W Mittag

J'ai trouvé la réponse à cette question sur le Notepad ++ Forum, répondu en 2010 par CChris qui semble faire autorité.

Question: Encodage ANSI?

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"
3
Owen_R