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ベストプラクティス -プロフェッショナルによるコードとテクニック
- 作者: Gregory Brown,高橋征義,笹井崇司
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/03/26
- メディア: 大型本
- 購入: 9人 クリック: 307回
- この商品を含むブログ (43件) を見る