rubyベストプラクティスchapter7.2

国際化を意識した一般的なライブラリについて
おおざっぱにはこんな感じ。

基本utf-8で書く

マジックコメント必須

ファイルの入出力は文字コードを意識して

具体的には

File.read("foo.txt", encoding:"ISO-8859-1:UTF-8")

とか

File.open("foo.txt", "w:ISO-8859-1:UTF-8") { |f| f << "hoge" }

と書く。
いずれも、前がファイルのエンコーディングで後ろがソースのエンコーディング。
それぞれ外部エンコーディングと内部エンコーディングと言うんだけど、ようするにこう書くことによって入出力ファイルとソースエンコーディングが違う場合もソースエンコーディングにあわせて処理が出来る。

ここから一歩進めて、「入力ファイルのエンコーディングはわからん」という時は
どこかで、ユーザから入力ファイルのエンコーディングを指定させて前を変数にしておけばいいと思う。

バイナリファイルは意外な落し穴

img_data = File.read("foo.png")

ってコードはruby1.8系ではうまく動いていたけど、ruby1.9ではうまく動かない。1.9でバイナリファイルを開く場合は「binread()」を使用すべき。

img_data = File.binread("foo.png")

さらにバイナリファイルを書き込む必要がある時は"wb"を使用すべき。1.9から意味あいが変った。1.8では行末文字の変換をしてくれているだけだったけど、1.9からはASCII-8BITにしてくれるらしい。"wb"と"rb"のところ、refeでは記述がなかったなぁ。。。。

上の方が1.9系が出てけっこうたっているので常識っぽくなってきたけど、バイナリファイルのところとかって全然知らなかったなぁ。

なんでもかんでもソースエンコーディングに合せる必要ない

ASCII文字だけで構成されている文字列だとエンコーディングは関係なく比較、合成が出来る。
また比較、合成をしなければ文字列のエンコーディングはあまり意識する必要がない。


Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック