QA@IT

ASCII-8BIT が外部エンコーディングの場合、書き込み時に変換処理が行われない?

2857 PV

「♥」(U+2665) を CP932 に変換しようとしたら、CP932 に存在しない文字なのでエラーになります。

% ruby -e '"\u2665".encode("cp932")'
-e:1:in `encode': U+2665 from UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
    from -e:1:in `<main>'

外部エンコーディングを CP932 に設定したファイルに出力しようとしても同じエラーになります。

% ruby -e 'File.open("/tmp/hoge", "w:cp932").puts("\u2665")'
-e:1:in `write': U+2665 from UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
    from -e:1:in `puts'
    from -e:1:in `<main>'

同様に ASCII-8BIT に変換しようとしてもエラーになります。

% ruby -e '"\u2665".encode("ascii-8bit")'
-e:1:in `encode': U+2665 from UTF-8 to ASCII-8BIT (Encoding::UndefinedConversionError)
    from -e:1:in `<main>'

ところが、外部エンコーディングを ASCII-8BIT に設定したファイルに出力しようとしてもエラーにはなりません。

% ruby -e 'File.open("/tmp/hoge", "w:ascii-8bit").puts("\u2665")'

ASCII-8BIT が外部エンコーディングの場合は、変換処理を行わないという特別な扱いになるのでしょうか。

回答

あれ、そんなことしたっけっとちょっと思ったんですが、確かにそうなってますね。
理由は「ASCII-8BITは特別なエンコーディングだから」という事になると思います。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。