来自Excel文件的UTF-8中的无效字节序列

问题描述 投票:0回答:1

((Ruby 2.5)我有一种方法可以读取和解析通过Alchemy CMS上传的csv文件

def process_csv(csv_file, current_user_id, original_filename)
    lock_importer

    errors           = []
    index            = 0
    string_converter = lambda { |field| field.strip }
    total            = CSV.foreach(csv_file, headers: true).count
    csv_string = csv_file.read.encode!("UTF-8", "iso-8859-1", invalid: :replace)

    CSV.parse(csv_string, headers: true, header_converters: :symbol, skip_blanks: true, converters: [string_converter] ) do |row|
    # do other stuff
end

但是当我尝试上载具有包含特殊字符的字符串的列(名称)的csv文件时,会收到Invalid Byte Sequence in UTF-8错误。我正在尝试测试值N'öt Réal Stô'rë

我尝试了一些在网络上找到的解决方案,但是没有运气-有任何建议吗?

ruby-on-rails encoding alchemy-cms ruby-2.5
1个回答
0
投票

尚不清楚您的csv_file是什么。我想这是一个文件对象。

有时我从Excel中将csv作为UTF-16获得。因此,让我们尝试一个示例:

我在UTF-16BE中存储了一个具有以下内容的csv文件:

line;comment;UmlautÄ
1;Das ist UTF-16 BE;Ä
2;öüäÖÄÜ;Ä

如果我执行以下代码:

require 'csv'
def process_csv(csv_file)
    csv_string = csv_file.read#.encode!("UTF-8", "iso-8859-1", invalid: :replace)
    CSV.parse(csv_string, headers: true, skip_blanks: true, col_sep: ';') do |row|
      p row # do other stuff
    end
end

process_csv(File.open('example_utf16BE.txt'))

然后我也收到Invalid byte sequence in UTF-8错误。

如果我使用

process_csv(File.open('example_utf16BE.txt', 'rb', encoding: 'BOM|utf-16BE'))

然后一切正常。

所以我想,您得到了wron编码的File对象,代码csv_file.read.encode!("UTF-8", "iso-8859-1", invalid: :replace)是修复此问题的代码部分。

您可以做什么:

添加到您的代码:

    p csv_file
    p csv_file.external_encoding

您应该得到

#<File:example_utf16BE.txt>
#<Encoding:UTF-16BE>

现在检查文件是否(在我的示例中:example_utf16BE.txt确实具有第二行的编码。

如果不是,请尝试调整文件对象的创建。如果无法做到这一点,则可以在读取内容之前尝试使用csv_file.set_encoding 'utf-8'更改编码。

© www.soinside.com 2019 - 2024. All rights reserved.