トップ «前の日記(2010年11月29日) 最新 次の日記(2011年01月11日)» 編集

Masa's blog

検索キーワード:

2010年11月30日 ruby-1.9.xのエンコーディング関係のエラー [長年日記]

_ invalid multibyte char (US-ASCII)

たとえばeuc-jpで記述されたスクリプトの日本語がらみの部分でこのエラーが出た場合は、スプリプトの先頭を

#! /usr/bin/ruby
# -*- encoding: euc-jp -*-

のようにして、エンコーディングを指定する。

追記 : 上記のようにしてもダメなことがあった。`#! /usr/bin/ruby -Ke' と指定するとOKとなった。

_ incompatible character encodings: EUC-JP and ASCII-8BIT (Encoding::CompatibilityError)

たとえばeuc-jpで文字列が格納されているはずの変数strでこのエラーが出た場合は

str.force_encoding('euc-jp')

のようにしてエンコーディングを変更してやる。

実際には dbi, dbd-odbc辺りでこの現象が出た。以下のように対応した。

sql = <<SQL
        select * from member where id >= ?
SQL
sth = dbh.prepare(sql)
sth.execute(1)
while (row = sth.fetch)
        sth.column_names.each {|name|
                if (row[name].kind_of?(String))
                        row[name].force_encoding('euc-jp')
                end
        }
        puts "セレクトに成功しました(id=#{row['id']})(name=#{row['name']})(job=#{row['job']})"
end
sth.finish

いずれもruby-1.8系からruby-1.9系への変更による影響。