BLOGTIMES
2013/03/31

invalid byte sequence in Windows-31J が出たときは

  Tips ruby  charset 
このエントリーをはてなブックマークに追加

以前も Ruby 1.9 の文字コード周りは Encoding::CompatibilityError にハマったり、Encoding::UndefinedConversionError にハマったりしましたが、今日は invalid byte sequence in Windows-31J というエラーにどっぷりとハマってしまいました。コードは極簡単な TSV を読み取って表示するだけのもの。

hoge.rb

require 'csv' CSV.foreach('hoge.txt', :headers => true, :col_sep=>"\t") do |row| puts row end

これを実行するとこんな感じになってしまいます。

C:\>jruby hoge.rb ArgumentError: invalid byte sequence in Windows-31J =~ at org/jruby/RubyRegexp.java:1487 =~ at org/jruby/RubyString.java:1715 init_separators at c:/jruby-1.7.3/lib/ruby/1.9/csv.rb:2058 initialize at c:/jruby-1.7.3/lib/ruby/1.9/csv.rb:1590 open at c:/jruby-1.7.3/lib/ruby/1.9/csv.rb:1349 foreach at c:/jruby-1.7.3/lib/ruby/1.9/csv.rb:1207 (root) at hoge.rb:3

これは Encoding.default_external と実際の文字コードがずれているために発生するようなので、起動時に -E オプションで文字コードを指定してやるか、

ruby -Eutf-8 hoge.rb

もしくは下記のように Encoding.default_external の値をファイル内の文字コードと合わせてやればいいようです。

Encoding.default_external = 'UTF-8'

File.open() を使う場合には、File.open('hoge.txt', 'r:utf-8') という感じで、モード設定のところに文字コードが指定できます。
今回は -E でオプションを設定してみたところ、うまくいきました。

C:\>jruby -Eutf-8 hoge.rb ほげ,ふが

参考


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5698
    Trackbacks
    Vagrantでshellscriptによるprovisionをしようとしたらエラーが出ました。 [default] Running cleanup tasks for 'shell' provisioner... C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.4.2/plugins/provisioners/shell/provisioner.rb:88:in `gsub!': invalid byte sequence in Windows-31J (ArgumentError) from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.4.2/plugins/provisioners/shell/pro...
    DQNEO起業日記 (2014/02/02 20:08)
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン