web-dev-qa-db-ja.com

Notepad ++が「ANSI」と呼ぶだけのエンコーディングですが、Rubyの場合、それを何と呼ぶか​​知っていますか?

Notepad ++が(ドロップダウンの[エンコード]メニューで) "ANSI"と言っている.txtがたくさんあります。

それらにはドイツ語の文字[äöüß]が含まれており、Notepad ++では問題なく表示されます。

しかし、私はFile.read 'this is a German text example.txt'それら。

だから誰も私が与えるべき引数を知っていますかEncoding.default_external=

(それが解決策になると思いますよね?)

いつ 'utf-8'または'cp850'、「äöüß」を含む「ANSI」ファイルを「\ xE4\xF6\xFC\xDF」として読み込みます...

(回答の中で明らかに「明白な」ことについて言及することを躊躇しないでください。私はあなたができる限り同じくらい初心者ですが、この質問をするのに十分なだけ知っています。)

26
Owen_R

それらが意味することはおそらくISO/IEC 8859-1(別名Latin-1)、ISO-8859-1、ISO/IEC 8859-15(別名Latin-9)またはWindows-1252(別名CP 1252)です。それらの4つすべてにä位置0xE4

12
Jörg W Mittag

私はこの質問への回答をNotepad ++フォーラムで見つけました。

質問: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

「cp1252」、エイリアス「windows-1252」だと思います。

Jörgの回答を読んだ後、Ruby-doc.orgの Encoding ページに戻り、彼が言及した特定のエンコーディングへの参照を見つけようとしたところ、Encodings.aliasesメソッドを見つけました。

そのため、この回答の最後にメソッドをまとめました。

次に、notepad ++で出力を見て、「ANSI」とutf-8の両方として表示し、irbの出力と比較しました...

Utf-8ファイルが 'ANSI'として表示したときにNotepad ++で表示されたのとまったく同じ方法で文字化けしたirb出力の2つの場所しか見つけることができませんでした。それらの場所はcp1252とcp1254用でした。

cp1252はどうやら私の「ファイルシステム」エンコーディングなので、それを使用します。

1252と1254の両方を試し、utf-8に変換されたすべてのファイルのコピーを作成するスクリプトを作成しました。

これまでのところ、utf-8正規表現は両方のファイルセットで機能するようです。

これらのエンコーディングの頭痛の種に遭遇する前に、私が実際にaccomplishしようとしていたことを思い出す必要があります。 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