restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【メモ】文字コード(#! 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,Ruby,Emacsでの文字設定を調べてみた。

 

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

emacs上・・・utf-8

f:id:restofwaterimp:20140125083157p:plain

 

はて、なんだろうと考えていたら、この本って、実行環境がWindowsが前提だったことを思い出した。

そこで、#! ruby -Ksを試しに恥ずして、実行したら、文字コードに関するエラーは外れた。

おまじないと思って、無視していたのだが、書籍を見なおしたら、一応書いてあった。

#! ruby -Ks ・・・ ver 1.8までのRubyがファイルの日本語を判定するために使う

# -*- coding: xxxxx -*- ・・・ ver1.9以降のRubyのファイルが日本語を判定するために使う

 

と、いうことであった。

つまりは複数のバージョンの指定を記載しており、多分、先に書いてあった旧バージョンの文字コードを判定してしまっていたのだろう。

 

そのため、実行時に、RubyはこのファイルをWIndows-31Jとして認識しているため、外部ファイルであるcsvUTF-8なのに、実行ソースはWindows-31Jで認識していた。という結論である。

いい勉強になりました。

 

参考にしたURL

OSとRubyスクリプト文字コードが異なる場合の対策

http://pgnote.net/?p=211