質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

2475閲覧

ruby 1.9.3と2.2における文字コードの扱いの違いについて

domingojapan

総合スコア26

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/07/20 12:08

###前提・実現したいこと
ruby 1.9.3を使用して
・Excelファイルをreadする(openofficeとかではなく、MicrosoftExcelです)
・readしたExcelファイルには各シート毎にデータが格納されているので、所定のテキストフォーマットに整形
・整形したデータをcsvファイルに書き出す
rubyソースの管理をしています。 rubyの実行OSはWindows7です。

ruby1.9.3で動作保証ができているものの、ruby1.9系はすでにEOLを迎えていますし、今回2.2.4を入れました。

しかし、rubyを2.2.4にあげてrubyを実行すると下記のようなエラーが出ました。

###発生している問題・エラーメッセージ
48:in `write': U+03E8 from UTF-8 to Windows-31J (Encoding::UndefinedConversionError)

###該当のソースコード

def create_output_file(xlsx, fileName, modelName)
//ディレクトリパスを設定
dir = "config\#{modelName}\gui"
//ディレクトリがなければ作成する
FileUtils.mkdir_p(dir) unless FileTest.exist?(dir)
//ファイルを書き込み用で開く
io = File.open("#{dir}\#{fileName}", "w:SJIS:UTF-8");
return io
end


//読み出し用のxlsxファイルの読み出しはrooライブラリを使用。
//エクセルファイルを取得
xlsx = Roo::Excelx.new(name)


//CSVファイルに出力するメソッド
def output_csv_file(io, output)
if output.empty? == false then
//ファイルに出力する
io.puts(output) <--------エラーの48行目。ここで指摘されている
puts(output) //コンソールにも出力する
output.clear
end
end

###試したこと
エラーで指摘されている48行目の
io.puts(output)

io.puts(output.encode(Encoding::Windows_31J, undef: :replace))
にするとエラーは解消されたが、
生成されたCSVファイルの中身を確認するとruby1.9.3でコンパイルしたものと
まるっきり別物でした。i.e Not期待値

###確認したい事は下記2点です
1点目;
ruby1.9.3とruby2.2系で文字コードに関する部分の処理で
ガードが厳しくなるような仕様変更が入ったのかを確認したい

2点目:
ruby2.2系で上記のEncoding::UndefinedConversionErrorを回避するには、どこをいじればよいか?
Excel/CSVを扱う上での宿命といえば宿命なんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

UnicodeのU+03E8の文字が実際に使われているとは思えず、03E8 が10進で1000であることからして、文字で無いデータを文字として扱ったためのエラーでは無いかと思います。

出ている情報が少ないため、これくらいしか言えません。

投稿2016/07/20 12:53

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

domingojapan

2016/07/27 13:47

すいません。 1週間たってしまったのですが、エラー内容に対しては自己解決できました。 >・Excelファイルをreadする(openofficeとかではなく、MicrosoftExcelです) >・readしたExcelファイルには各シート毎にデータが格納されているので、所定のテキストフォーマットに整形 readしたデータが 0xFF(文字列) 1000(数値) となっていた場合、 ruby1.9だとなぜかエラーがでず、ruby2.2だと1000(数値)だという事で Encoding::UndefinedConversionError を吐き出していました。 そこでエラーを吐き出す io.puts(output) <--------エラーの48行目。ここで指摘されている の処理の前に「数値だったら文字列に変換する処理」を追加したら エラーが解消し、正常に動作しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問