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

Ruby on rails Rails ActiveRecord UTF-8问题中的无效字节序列,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我正在使用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[:xm

我正在使用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
但是Rails抱怨UTF-8中的字节序列无效


请帮帮我。

ruby、ActiveRecord或SQL Server在抱怨什么?我猜是SQL Server。确保数据库中efile字段的数据类型为二进制BLOB。

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

我认为,在写入之前,将
数据设置为二进制流:

data.force_encoding "ASCII-8BIT"

可能会有帮助。

您应该将问题分解为组成部分,并对较小的单元进行故障排除。消除复杂性,直到找到问题的根源。例如,您是否尝试过只编写一个简单的
文档。使用控制台中的属性创建
,以消除控制器代码可能存在错误的可能性?类似于
Document.create:efile=>File.read('sometny.zip')
的东西,然后从那里开始

假设它正常工作或中断,则支持请求会简单得多,噪音与问题的比率也会降低。现在我怀疑您的控制器代码,而不是SQL Server适配器或连接模式,因为我已经对简单的二进制数据进行了彻底的测试。假设上述方法不起作用,您可以接着检查较小的组件

例如,
efile
列的数据类型是什么?在控制台中执行此操作以查找,
Document.columns\u hash['efile']
,并查看
@sql\u type
。它是否适合像
varbinary(max)

接下来,您对SQL Server适配器TinyTDS使用什么连接模式?默认情况下,TinyTDS会根据需要将所有内容转换为UTF8,并且非常聪明。我对它进行了测试,从二进制到许多不同的编码。顺便说一句,如果您使用的是TinyTDS,您是否确保使用libiconv编译了FreeTDS,以便它能够正确地完成所有这些工作?假设您的路径中有FreeTDS的二进制文件,您可以通过在控制台
tsql-C
中执行以下操作轻松地进行检查。这应该输出几行,查找“iconv库:是”。还要确保你运行的是0.91或更好


最后,有一点建议,设置TEXTSIZE是非常错误的。每次连接只需执行一次。参见此处

我想ActiveRecord会抱怨。可能是因为data.sysread.encoding=>#但是MSSQL在UTF-16中存储blob非常感谢您的帮助。这个错误消失了。但为什么我把zip文件写到DB,然后从DB读到文件系统。这两个文件在1字节内彼此不同。那一个字节会损坏zip文件((除了rails,如果我们存储二进制,我们通常存储为varbinary或任何类型,将字符串视为不透明数据,这与可打印字符串不同。rails默认情况下将字符串视为可打印字符串并映射到varchar,因此除非调整rails或迁移,否则字符串可能映射到varchar。DB具有默认字符集。如果列为string(varchar)然后,当读入时,很自然会被视为可打印字符串,导致发生编码映射,这在您的情况下是UTF-8。非常感谢MetaSkills的帮助!首先,我尝试了Document.create:efile=>File.read('somethiny.zip')在cosole中,但得到了相同的错误消息。第二,eFile字段有一个数据类型映像。第三,我在Windows下使用TinyTDS。最后,data.force_编码“ASCII-8BIT”对我有帮助,但没有完全帮助(但为什么我将zip文件写入DB,然后从DB读取到文件系统。这两个文件在1字节内彼此不同)。这很奇怪
data.force_encoding "ASCII-8BIT"