目的:Rubyのエンコーディングについての備忘録を作成すること
以下の環境により実施
OS:Windows8.1
Ruby:v2.2.2 x64
ディレクトリ構造:
作業ディレクトリ
|-encoding-test.rb
|-test-data.csv(保存はUTF-8)
|-csv-read.rb
|-csv-write.rb
前提条件
- なし
以下の流れにより説明
- デフォルトエンコーディングの確認
- 外部エンコーディングと内部エンコーディング
- 実際に起きたエラーについて
- おまけ(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
分かれば、大した問題ではないんだよな~
以上!!
以下、参考にさせて頂いたサイト