Ruby 資料一覧

M17N(Ruby-1.9)

2012/11/11更新

対応バージョン: 1.9

Ruby-1.9になってM17Nまわりの仕様が変わり、スクリプト自体の文字エンコーディングをマジックコメントで明示するようになった。

UTF-8の場合
#!/usr/local/bin/ruby
#coding:utf-8

ただマジックコメントはファイル単位で機能するため、スクリプト内から外部のファイルを読み込んで文字列処理などを行う場合はマジックコメントは機能せず、そのプログラムを実行する環境のLANG環境変数で指定されたエンコーディングに従って動作する。

結果、コマンドラインから実行するとLANG環境変数がUTF-8に設定されていてうまく動く場合でも、cronやCGIなど起動元が別機構の場合はそれぞれの機構の作法に従って環境変数を設定しておかないとエラーになってしまう。

例えばカンマ区切りのデータをパイプ(|)区切りに変更しようとした場合、LANG環境変数がデフォルトのCのままだと以下のようなエラーになる。

スクリプト
#!/usr/local/bin/ruby
#coding:utf-8

# (途中の処理は省略)

data = line.split(",").join("|")
エラー
in `split': invalid byte sequence in US-invalid byte sequence in US-ASCII
(ArgumentError)

以下にcronとApacheのLANG設定方法を示す。他の機構の場合はそれぞれの作法に従って環境変数を設定する。

cron

方法1)

先頭で環境変数を設定するとそのcrontab内の実行プログラム全てで有効になる

LANG=ja_JP.UTF-8

# 毎日3:00にバックアップを実行する
0 3 * * * backup.rb

# 5分おきにシステム状態をチェックする
*/5 * * * * syscheck.rb
方法2)

各プログラムの先頭で環境変数を設定するとプログラムによって環境変数を変えることができる

# 毎日3:00にバックアップを実行する
0 3 * * * env LANG=C backup.rb

# 5分おきにシステム状態をチェックする
*/5 * * * * env LANG=ja_JP.UTF-8 syscheck.rb

Apache

httpd.confにてSetEnvディレクティブを設定する。

SetEnv LANG ja_JP.UTF-8

関連資料・記事