【メモ】文字コード(#! Ruby -Ksの意味)
「作りながら学ぶRuby 入門」の16章で、csvファイルからのファイル入出力を試していたら、以下のエラーが発生。
実行環境 mac OS 10.8
Ruby 2.1.0
Emacs 24.3
ex1601.rb:25:in `toFormattedString': incompatible character encodings: UTF-8 and Windows-31J (Encoding::CompatibilityError)
from ex1601.rb:82:in `block in listAllBookInfos'
from ex1601.rb:81:in `each'
from ex1601.rb:81:in `listAllBookInfos'
from ex1601.rb:174:in `run'
from ex1601.rb:189:in `<main>'
外部との入出力時がなく、ruby の実行環境上での文字のやりとりでは出てこなかったので、なんかあるのかなと調べてみた。
OS・・・UTF-8だよな〜
locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=
作成ファイル・・・uft-8
file --mime ex1601.rb
ex1601.rb: text/x-c++; charset=utf-8
はて、なんだろうと考えていたら、この本って、実行環境がWindowsが前提だったことを思い出した。
そこで、#! ruby -Ksを試しに恥ずして、実行したら、文字コードに関するエラーは外れた。
おまじないと思って、無視していたのだが、書籍を見なおしたら、一応書いてあった。
#! ruby -Ks ・・・ ver 1.8までのRubyがファイルの日本語を判定するために使う
# -*- coding: xxxxx -*- ・・・ ver1.9以降のRubyのファイルが日本語を判定するために使う
と、いうことであった。
つまりは複数のバージョンの指定を記載しており、多分、先に書いてあった旧バージョンの文字コードを判定してしまっていたのだろう。
そのため、実行時に、RubyはこのファイルをWIndows-31Jとして認識しているため、外部ファイルであるcsvはUTF-8なのに、実行ソースはWindows-31Jで認識していた。という結論である。
いい勉強になりました。
参考にしたURL