0
4

4 に答える 4

1

値にアクセスでき、CSV から読み取ることができる場合は、次のようなヘルパーを使用できます。

  def ascii_only(string)
    encoding_options = {
        :invalid           => :replace,  # Replace invalid byte sequences
        :undef             => :replace,  # Replace anything not defined in ASCII
        :replace           => '',        # Use a blank for those replacements
        :UNIVERSAL_NEWLINE_DECORATOR => true       # Always break lines with \n
    }
    string.encode Encoding.find('ASCII'), encoding_options
  end
于 2013-10-29T05:11:34.463 に答える
1

使用している Ruby のバージョンが不明です。1.9.3以上だと思います。

これを使用して、CSV ファイルが保存されているエンコードを強制してみてください

 force_encoding(encoding)
于 2013-10-29T05:05:01.887 に答える
0

やりたいことは、カスタム CSV コンバーターを作成し、foreach を呼び出すときにオプション ハッシュでそのコンバーターを参照することです。

カスタム コンバーター:

  #define custom converter to eliminate non ASCII characters
  CSV::Converters[:only_ascii] = lambda{|s| 
    begin 
      s.force_encoding("utf-8").encode("utf-8", "binary", :replace => "", :undef => :replace, :invalid => :replace)
    rescue
      s
    end
  }

そして、あなたのオプションのハッシュで:

   CSV.foreach(file.path, headers: true, converters: [:only_ascii]) do |row|
     Yadda yadda
   end

ここで、それらを空白の代わりに合理的な ASCII 同等物に置き換えたい場合は、これを行うカスタム関数を記述してから、カスタム コンバーターで :replace => "" と記述している場合、:replace => you_custom_method_name_here を実行します。

于 2014-03-03T19:30:52.703 に答える
0

Ruby 1.9.3 または 2.0 では問題を再現できません。私はこのテストコードを書きました:

require 'csv'

CSV.foreach('test.csv') do |row|
  puts row
end

そして、この test.csv ファイルを作成しました:

char
™
®

コードを実行すると、文字が正しく表示されます。

于 2013-10-29T05:29:08.473 に答える