Кодировка, которую Notepad++ просто называет ANSI, кто-нибудь знает, как ее назвать для Ruby?

У меня есть куча .txt, которые Notepad ++ говорит (в раскрывающемся меню «Кодировка») как «ANSI».

В них есть немецкие символы, [äöüß], которые отлично отображаются в Notepad++.

Но они не появляются прямо в irb, когда я их File.read 'this is a German text example.txt'.

Так кто-нибудь знает, какой аргумент я должен привести Encoding.default_external=?

(Я предполагаю, что это было бы решением, верно?)

Когда 'utf-8' или 'cp850', он читает файл "ANSI" с "äöüß" как "\xE4\xF6\xFC\xDF"...

(Пожалуйста, не стесняйтесь упоминать в своих ответах очевидно «очевидные» вещи; я настолько новичок, насколько вы можете быть, и все еще знаю достаточно, чтобы задать этот вопрос.)


person Owen_AR    schedule 18.04.2013    source источник
comment
Это зависит от локали вашей ОС. Для немецкого или английского это Windows-1252. Хотя Notepad++ может не следовать этому и просто использует его как псевдоним для Windows-1252. Это точно не какая-то кодировка ISO. См. en.wikipedia.org/wiki/Windows_ANSI_code_page#ANSI_code_page.   -  person Esailija    schedule 18.04.2013
comment
Спасибо, я думаю, что это был cp1252, да.   -  person Owen_AR    schedule 19.04.2013


Ответы (3)


Вероятно, они имеют в виду ISO/IEC 8859-1 (он же Latin-1), ISO-8859-1, ISO/IEC 8859-15 (он же Latin-9) или Windows-1252 (он же CP 1252). Все 4 из них имеют ä в позиции 0xE4.

person Jörg W Mittag    schedule 18.04.2013
comment
Спасибо, я думаю, что это был cp1252, да. - person Owen_AR; 19.04.2013

Я нашел ответ на этот вопрос на форуме Notepad ++, на который в 2010 году ответил CChris, который кажется авторитетным.

Вопрос: кодировка ANSI?

Ответ:

Это будет системная кодовая страница вашего компьютера (кодовая страница 0).

Дополнительная информация:

Показать текущую кодовую страницу.

>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

Идентификаторы кодовых страниц< /сильный>

Identifier  .NET Name  Additional information
437         IBM437     OEM United States
person Love and peace - Joe Codeswell    schedule 23.01.2014

Я думаю, что это «cp1252», псевдоним «windows-1252».

Прочитав ответ Йорга, я вернулся на страницу Кодирование на ruby- doc.org пытался найти ссылки на конкретные кодировки, которые он упомянул, и тогда я заметил метод Encodings.aliases.

Поэтому я забил метод в конце этого ответа.

Затем я посмотрел на вывод в блокноте ++, рассматривая его как «ANSI» и utf-8, и сравнил его с выводом в irb...

Я смог найти только два места в выводе irb, где файл utf-8 был искажен точно так же, как он отображался в блокноте ++ при просмотре его как «ANSI», и эти места были для cp1252 и cp1254.

cp1252, по-видимому, является моей кодировкой «файловой системы», поэтому я использую ее.

Я написал скрипт, чтобы сделать копии всех файлов, преобразованных в utf-8, пробуя как с 1252, так и с 1254.

Регулярные выражения utf-8 пока работают с обоими наборами файлов.

Теперь я должен попытаться вспомнить, что я на самом деле пытался достичь до того, как столкнулся со всеми этими головными болями с кодированием. хD

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"
person Owen_AR    schedule 19.04.2013