生成CSV文件时设置字符编码Rails 4.2
Set character encoding when generating CSV file Rails 4.2
我有一个模块可以在包含时生成模型的 csv 文件。
# app/models/concerns/csv_exportable.rb
module CsvExportable
extend ActiveSupport::Concern
included do
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |thismodel|
csv << thismodel.attributes.values_at(*column_names)
end
end
end
end
end
并且我将模块包含在我要为其生成 csv 文件的模型中
# app/models/product.rb
class Reason < ActiveRecord::Base
include CsvExportable
.
.
end
在我的控制器中我这样做
respond_to do |format|
format.html
format.csv { send_data @products.to_csv, filename: 'products.csv' }
end
我想将生成的 csv 文件的字符编码设置为 Shift_JIS 而不是默认的 utf-8。做这个的最好方式是什么 ?谢谢
编辑:
我试过了
format.csv { send_data (@products.to_csv).encode("SHIFT-JIS"), filename: 'products.csv' }
现在我收到一个错误 Encoding::ConverterNotFoundError code converter not found (UTF-8 to SHIFT-JIS)
您可以在 options
散列中传递 encoding: '<non utf-8 encoding>'
选项,您在 CsvExportable
中传递给 to_csv
以便它可用于 CSV.generate
方法,同时正在生成 csv 文件。
format.csv {
send_data (@products.to_csv).encode(Encoding::SJIS),
filename: 'products.csv',
type: 'text/csv; charset=shift_jis'
}
成功了
我有一个模块可以在包含时生成模型的 csv 文件。
# app/models/concerns/csv_exportable.rb
module CsvExportable
extend ActiveSupport::Concern
included do
def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |thismodel|
csv << thismodel.attributes.values_at(*column_names)
end
end
end
end
end
并且我将模块包含在我要为其生成 csv 文件的模型中
# app/models/product.rb
class Reason < ActiveRecord::Base
include CsvExportable
.
.
end
在我的控制器中我这样做
respond_to do |format|
format.html
format.csv { send_data @products.to_csv, filename: 'products.csv' }
end
我想将生成的 csv 文件的字符编码设置为 Shift_JIS 而不是默认的 utf-8。做这个的最好方式是什么 ?谢谢
编辑:
我试过了
format.csv { send_data (@products.to_csv).encode("SHIFT-JIS"), filename: 'products.csv' }
现在我收到一个错误 Encoding::ConverterNotFoundError code converter not found (UTF-8 to SHIFT-JIS)
您可以在 options
散列中传递 encoding: '<non utf-8 encoding>'
选项,您在 CsvExportable
中传递给 to_csv
以便它可用于 CSV.generate
方法,同时正在生成 csv 文件。
format.csv {
send_data (@products.to_csv).encode(Encoding::SJIS),
filename: 'products.csv',
type: 'text/csv; charset=shift_jis'
}
成功了