スポンサーリンク

2015年5月12日

Rubyのエンコーディングについて

タイトル:Rubyのエンコーディングについて

目的:Rubyのエンコーディングについての備忘録を作成すること

以下の環境により実施
OS:Windows8.1
Ruby:v2.2.2 x64
ディレクトリ構造:
作業ディレクトリ
|-encoding-test.rb
|-test-data.csv(保存はUTF-8)
|-csv-read.rb
|-csv-write.rb

前提条件

  • なし

以下の流れにより説明
  1. デフォルトエンコーディングの確認
  2. 外部エンコーディングと内部エンコーディング
  3. 実際に起きたエラーについて
  4. おまけ(CSVファイルの読み書き)

何故、Rubyのエンコーディングについて書いたのかと言うと、
csvファイルを使いたくてRubyで読み書きをしていた際、とあるエラーが発生し追っていく内にエンコーディングに行き着いたからです。

今まで、何気なく使っていたのですが、
Rubyのエンコーディングについてよく分かっていなかったみたいです。
現役の方とも質疑応答したので、復習がてら備忘録を作成しようかと思います。

1.デフォルトエンコーディングの確認

そも、文字エンコーディングって何だろうか...
文字コードを別の文字コードに変換することを文字エンコーディングと言う。
コンピュータで文字を入力するには色々な種類の文字コードがある。
大体は、国際基準のUTF-8を使っているんだけど...Windowsだと...

ここでは、
WindowsにおいてRubyを使用する時のデフォルトエンコーディングを確認する。

1.1
まず最初に、
WindowsでRubyを使う時のデフォルトのエンコーディングは「Windows-31J」になっていた。
実際に確認するため、以下のコードを実行する。
ソース1

結果は以下のようになる。
#<Encoding:Windows-31J>
nil
nil
nil
#<Encoding:UTF-8>
#<Encoding:UTF-8>

1.2
デフォルトでは、Windows-31Jが設定されている。
その後、UTF-8に設定しているので、出力が変わっている。
これで、扱う文字コードが変えられる。

2.外部エンコーディングと内部エンコーディング

2.1
1.1のソース内に外部内部とあるが何かと言ったところを記述する。
「外部エンコーディング」、入出力ファイルの文字コードを表す。
「内部エンコーディング」、ソース内部で扱う文字列の文字コードを表す。

3.実際に起きたエラーについて

3.1
まず、起きたエラーは以下のもの
エラー:invalid byte sequence in Windows-31J (ArgumentError)

3.2
そもそも何で起きたのかと言うところだが、
自分が取っていた行動を以下へ記述する。

Windowsの新規テキストファイル作成でcsvファイルを作成した。
その後、内容を編集しUTF-8で保存した。
それをRubyで読み込もうとしたところエラーが発生した。

3.3
これは、Rubyの外部エンコーディングの設定が「Windows-31J」になっているため、
読み込みcsvファイル(UTF-8)では、文字コード形式が違うためエラーとなった。

つまり、ファイルとエンコーディング設定の文字コード形式が合致しないため発生した。

3.4
エラー内容をコピペ検索するだけで、解決法は出てきますね...
一応方法ざっくり
  • 「-E UTF-8」を実行オプションにつける
  • 「set RUBYOPT=-EUTF-8」で環境変数いじる
  • 外部エンコーディングの文字コードを合わせ
  • ファイルの文字コードを合わせる

こんなところかな...

4.おまけ

csvの読み書きをRubyで作ったので上げておく。
(即席ソースなので期待はしないで下さい。)

4.1
csvの読み込みソースは以下
ソース2

4.2
csvの書き込み(追記)ソースは以下
ソース3

4.3
テストに使ったcsvファイルは以下
csv

分かれば、大した問題ではないんだよな~

以上!!

以下、参考にさせて頂いたサイト

人気の投稿