Ruby on rails 使用带有无效字符的Net::FTP gettextfile(ASCII-8BIT与UTF-8)

Ruby on rails 使用带有无效字符的Net::FTP gettextfile(ASCII-8BIT与UTF-8),ruby-on-rails,ruby,encoding,ftp,Ruby On Rails,Ruby,Encoding,Ftp,我有一个通过FTP从大型机获取平面文件的过程。这通常可以正常工作,但文件偶尔会包含重音字符。如果我尝试获取包含重音的文件,整个过程将失败,并出现以下错误:Encoding::UnfinedConversionError:“\x88”从ASCII-8BIT到UTF-8 这是使用Net::FTP的gettextfile方法。许多人建议简单地切换到getbinaryfile——这样做可以让我下载文件,但结果文件是我无法再解析的(说是UTF-8,但内容没有意义) 有没有办法简单地获取文件并将其保存为AS

我有一个通过FTP从大型机获取平面文件的过程。这通常可以正常工作,但文件偶尔会包含重音字符。如果我尝试获取包含重音的文件,整个过程将失败,并出现以下错误:
Encoding::UnfinedConversionError:“\x88”从ASCII-8BIT到UTF-8

这是使用
Net::FTP
gettextfile
方法。许多人建议简单地切换到
getbinaryfile
——这样做可以让我下载文件,但结果文件是我无法再解析的(说是UTF-8,但内容没有意义)

有没有办法简单地获取文件并将其保存为ASCII,而不让rails自动将输出转换为UTF-8?这是我的密码:

Net::FTP.open(config['host']) do |ftp|
  Rails.logger.info("FTP Connection established")

  ftp.login(config['user'], config['password'])
  Rails.logger.info("Login Successful")

  ftp.gettextfile("'#{config['es_in']}'", "data/es-in.#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}")
  ftp.gettextfile("'#{config['ca_in']}'", "data/ca-in.#{Time.now.utc.strftime("%Y%m%d-%H%M%S")}")

  Rails.logger.info("Download(s) completed, terminating connection.")
end

如果我没记错的话,FTP dom中的文本文件是ASCII-7bit,不能包含具有高位集(也称为ASCII-8BIT)的字符。重音字符,即使是扩展ASCII或8位字符,或者我们想要调用0x7F以上的任何字符,也需要以二进制模式传输

发件人:

因此,是的,您可能应该使用

二者在实际应用上的主要区别在于二进制模式不会进行行尾转换。如果源系统基于ECDIC或其他字长,
gettextfile
将动态地将文件转换为ASCII。遇到不在预期编码中的字符很容易引发您所看到的问题

如果文件在使用
getbinaryfile
传输后没有意义,则它可能位于大型机上UTF8之外的备用代码集中。您必须找出它在该系统上的代码集,并在下载后使用适当的编码设置打开该文件。您可以在*nix系统上使用
file
命令对文件的编码进行有根据的猜测,但这不是一个详尽的测试,可能会产生误导。因为该文件来自大型机,所以它可能使用不同的字号,如UTF-16BE、UTF-32LE,或者用EBCDIC编码。这就是处理备用操作系统和硬件变得非常烦人的地方

如果没有文本示例、文件的前两个字节以及十六进制转储中的文本采样,就很难为您提供帮助


而且,在所有这些之后,它可能更易于使用,或者使用gem来检索文件。cURL非常灵活,功能强大,可以为您提供所需的工具。

您缺少有问题的文本示例。了解文件的前两个字节以及文件的小十六进制转储也会有所帮助。寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题说明的问题对其他读者没有用。请参阅:
   ASCII

     The ASCII character set is as defined in the ARPA-Internet
     Protocol Handbook.  In FTP, ASCII characters are defined to be
     the lower half of an eight-bit code set (i.e., the most
     significant bit is zero).