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

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

ただいまの
回答率

90.12%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 981

domingojapan

score 11

前提・実現したいこと

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を扱う上での宿命といえば宿命なんでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/27 22:47

    すいません。
    1週間たってしまったのですが、エラー内容に対しては自己解決できました。

    >・Excelファイルをreadする(openofficeとかではなく、MicrosoftExcelです)
    >・readしたExcelファイルには各シート毎にデータが格納されているので、所定のテキストフォーマットに整形

    readしたデータが
    0xFF(文字列)
    1000(数値)
    となっていた場合、
    ruby1.9だとなぜかエラーがでず、ruby2.2だと1000(数値)だという事で
    Encoding::UndefinedConversionError
    を吐き出していました。

    そこでエラーを吐き出す
    io.puts(output) <--------エラーの48行目。ここで指摘されている
    の処理の前に「数値だったら文字列に変換する処理」を追加したら
    エラーが解消し、正常に動作しました。




    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる