Rails ActiveRecord UTF-8问题中的无效字节序列

Les*_*iev 2 activerecord ruby-on-rails ruby-on-rails-3

我正在使用MSSQL 2005.

我有StringIO对象,其中包含我的zip文件内容.

以下是我获取zip二进制数据的方法:

    stringio = Zip::ZipOutputStream::write_buffer do |zio|
        Eclaim.find_by_sql("SET TEXTSIZE 67108864")
        zio.put_next_entry("application.xml")
        #zio.write @claim_db[:xml]
        biblio = Nokogiri::XML('<?xml version="1.0" encoding="utf-8"?>' + @claim_db[:xml], &:noblanks)
        zio.write biblio.to_xml

        builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
            xml.documents {
                docs.where("ext not in (#{PROHIBITED_EXTS.collect{|v| "'#{v}'"}.join(', ')})").each{|doc|
                    zio.put_next_entry("#{doc[:materialtitle_id]}.#{doc[:ext]}")
                    zio.write doc[:efile]

                    xml.document(:id => doc[:materialtitle_id]) {
                        xml.title doc[:title]
                        xml.code doc[:code]
                        xml.filename "#{doc[:materialtitle_id]}.#{doc[:ext]}"
                        xml.extname doc[:ext]
                    }

                }
            }
        end

        zio.put_next_entry("docs.xml")
        zio.write builder.to_xml
    end

    stringio
Run Code Online (Sandbox Code Playgroud)

在我的控制器中我尝试:

data.rewind
@claim.docs.create(
    :title => 'Some file',
    :ext => 'zip',
    :size => data.length,
    :receive_date => Time.now,
    :efile => data.sysread
)
Run Code Online (Sandbox Code Playgroud)

但是Rails 在UTF-8中抱怨无效的字节序列

帮帮我吧.

shi*_*eya 6

如果流配置为UTF-8流,则无法写入压缩二进制文件(可能包含任何值).

我认为,data在写之前设置为二进制流:

data.force_encoding "ASCII-8BIT"
Run Code Online (Sandbox Code Playgroud)

可能有帮助.