目的: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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding: utf-8 | |
# File Name: encode-test.rb | |
# Create Day is 2015/05/12 | |
# Last Update Day is 2015/05/12 | |
# Gem List | |
# Require List | |
# 外部エンコーディング設定 | |
p Encoding.default_external | |
p $stdout.external_encoding | |
# 内部エンコーディング設定 | |
p Encoding.default_internal | |
p $stdout.internal_encoding | |
# 外部エンコーディングを変更 | |
Encoding.default_external = "UTF-8" | |
p Encoding.default_external | |
# 文字列のエンコードを確認 | |
str = "Hello World!!" | |
p str.encoding |
結果は以下のようになる。
#<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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding: utf-8 | |
# File Name: csv-read.rb | |
# Create Day is 2015/05/12 | |
# Last Update Day is 2015/05/12 | |
# Gem List | |
# Require List | |
require 'csv' | |
# 外部エンコーディングを変更 | |
Encoding.default_external = "UTF-8" | |
p Encoding.default_external | |
# csvファイルを読み込んで表示 | |
arr_of_arrs = CSV.read("test-data.csv") | |
arr_of_arrs.each do |row| | |
print row, "\n" | |
end |
4.2
csvの書き込み(追記)ソースは以下
ソース3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding: utf-8 | |
# File Name: csv-write.rb | |
# Create Day is 2015/05/12 | |
# Last Update Day is 2015/05/12 | |
# Gem List | |
# Require List | |
require 'csv' | |
# 外部エンコーディングを変更 | |
Encoding.default_external = "UTF-8" | |
p Encoding.default_external | |
# csvファイルへ追記 | |
CSV.open("test-data.csv", "a") do |csv| | |
csv << ["add1-title", "add1-name", "add1-text", "2015/5/12", "19:44:00"] | |
end |
4.3
テストに使ったcsvファイルは以下
csv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Title | Name | Text | yyyy/mm/dd | hh:mm:ss | |
---|---|---|---|---|---|
hoge | hoge | hogehoge | 2015/5/12 | 17:28:30 | |
huge | huge | hugehuge | 2015/5/12 | 18:59:00 | |
add1-title | add1-name | add1-text | 2015/5/12 | 19:44:00 | |
add1-title | add1-name | add1-text | 2015/5/12 | 19:44:00 | |
add1-title | add1-name | add1-text | 2015/5/12 | 19:44:00 |
分かれば、大した問題ではないんだよな~
以上!!
以下、参考にさせて頂いたサイト