【问题标题】:'Encoding::UndefinedConversionError "\xE9" from ASCII-8BIT to UTF-8' when using some ruby gems that using file.open in ruby on rails'Encoding::UndefinedConversionError "\xE9" from ASCII-8BIT to UTF-8' 当使用一些在 ruby​​ on rails 中使用 file.open 的 ruby​​ gem 时
【发布时间】:2012-10-26 03:04:18
【问题描述】:

我想要什么?

我想在 Rails 3.2 中从模板文件生成 .docx 文件或 .odt 文件
我想在里面使用日语。
在 ubuntu 服务器 12.04 & ruby​​ 1.9.3p194 & rails 3.2.8

发生了什么?

我尝试了 gem 'docx-templater' 和 'serenity'

ruby-docx-templater

https://github.com/jawspeak/ruby-docx-templater

1 个样品效果很好
2 尝试在我的 rails 应用程序中做同样的事情

在控制器中作为示例

def gen_docx
  input_file = './app/template/ExampleTemplate.docx'
  data = {
    :teacher => "Priya Vora",
    :building => "Building #14",
    :classroom => :'Rm 202',
    :district => "Washington County Public Schools",
    :senority => 12.25,
    :roster => [
      {:name => 'Sally', :age => 12, :attendence => '100%'},
      {:name => :Xiao, :age => 10, :attendence => '94%'},
      {:name => 'Bryan', :age => 13, :attendence => '100%'},
      {:name => 'Larry', :age => 11, :attendence => '90%'},
      {:name => 'Kumar', :age => 12, :attendence => '76%'},
      {:name => 'Amber', :age => 11, :attendence => '100%'},
      {:name => 'Isaiah', :age => 12, :attendence => '89%'},
      {:name => 'Omar', :age => 12, :attendence => '99%'},
      {:name => 'Xi', :age => 11, :attendence => '20%'},
      {:name => 'Noushin', :age => 12, :attendence => '100%'}
    ],
      :event_reports => [
        {:name => 'Science Museum Field Trip', :notes => 'PTA sponsored event. Spoke to Astronaut with HAM radio.'},
        {:name => 'Wilderness Center Retreat', :notes => '2 days hiking for charity:water fundraiser, $10,200 raised.'}
    ],
      :created_at => "11-12-03 02:01"
  }
  DocxTemplater::DocxCreator.new(input_file, data).generate_docx_file()
end

3 但出现错误
在 gem (docx_templater.rb 22) 中的以下点引发的错误

File.open(file_name, 'w') { |f| f.write(buffer) }

宁静

https://github.com/kremso/serenity

1 个样本效果很好
2 在我的 Rails 应用程序中做同样的事情并且效果很好
像这样

#encoding: utf-8
require 'serenity'
class Showcase
  include Serenity::Generator

  Person = Struct.new(:name, :items)
  Item = Struct.new(:name, :usage)

  def generate_showcase
    @title = 'Serenity inventory'

    mals_items = [Item.new('Moses Brothers Self-Defense Engine Frontier Model B', 'Lock and load')]
    mal = Person.new('Malcolm Reynolds', mals_items)

    jaynes_items = [Item.new('Vera', 'Callahan full-bore auto-lock with a customized trigger, double cartridge and thorough gauge'),
                Item.new('Lux', 'Ratatata'),
                Item.new('Knife', 'Cut-throat')]
    jayne = Person.new('Jayne Cobb', jaynes_items)

    @crew = [mal, jayne]

    render_odt 'app/template/showcase.odt'
  end
end

3 我尝试了包含日语的模板,但出现了错误。
在 gem(template.rb 22) 中的以下点引发的错误

    def process context
  tmpfiles = []
  Zip::ZipFile.open(@template) do |zipfile|
    %w(content.xml styles.xml).each do |xml_file|
      content = zipfile.read(xml_file)
      odteruby = OdtEruby.new(XmlReader.new(content))
      out = odteruby.evaluate(context)

      tmpfiles << (file = Tempfile.new("serenity"))
      file << out    #!!!! HERE !!!!
      file.close

      zipfile.replace(xml_file, file.path)
    end
  end
end

我做了什么?

  • 我发现'serenity' 在 gem 中对希腊语 (UTF-8) 进行了 rspec 测试。我以同样的方式尝试了日语。并且测试通过了!所以我认为问题不在于 Rails 设置中的宝石。

  • 在我的控制器或 lib 文件中添加魔术注释“#encoding: utf-8”

  • 确认 config/application.rb 中的 'config.encoding = "utf-8"'
  • 在“初始化!”上方的 config/enviroment.rb 中添加以下内容

    Encoding.default_external = 编码::UTF_8
    Encoding.default_internal = 编码::UTF_8

  • 我没有在我的 rails 应用程序中使用任何数据库。

但这一切都与我的案子无关……知道吗? 我可能不知道基本的东西......

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.2


    【解决方案1】:

    这有点老了,但我刚刚遇到了同样的情况。就我而言,这是在写入之前将临时文件设置为二进制模式的问题:

      tmpfiles << (file = Tempfile.new("serenity"))
      file.binmode
      file << out   
      file.close
    

    希望对你有帮助

    【讨论】:

    • 感谢您的回复。但我很抱歉这对我的情况不起作用。最后我的问题通过使用 theoo 的 fork gem 解决了。 theoo/github
    • 在为作为 JSON 接收的文件编写字节数组时,这让我摆脱了困境。正在写入文件并收到类似的错误。在文件上设置 binmode 是诀窍。谢谢!
    猜你喜欢
    • 2015-08-10
    • 2015-09-18
    • 1970-01-01
    • 2021-05-19
    • 2014-06-12
    • 2014-10-15
    • 1970-01-01
    • 2012-09-14
    • 2017-04-20
    相关资源
    最近更新 更多