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

时间:2014-05-14 18:04:39

标签: ruby-on-rails ruby encoding ftp

我有一个通过FTP从大型机获取平面文件的进程。这通常可以正常工作,但不时的文件将包含一些重音字符。如果我尝试获取包含重音的文件,整个过程将失败,并显示以下错误:Encoding::UndefinedConversionError: "\x88" from ASCII-8BIT to UTF-8

那是使用Net::FTP的{​​{1}}方法。许多人建议只需切换到gettextfile - 这样做可以让我下载文件,但是生成的文件是我无法解析的东西(说它是UTF-8,但内容没有意义)

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

getbinaryfile

1 个答案:

答案 0 :(得分:0)

如果我没记错的话,FTP-dom中的文本文件是ASCII-7bit,不能包含高位设置的字符,AKA ASCII-8BIT。重音字符,即使在扩展的ASCII或8BIT或我们想要调用0x7F以上的任何内容时,也需要以二进制模式传输。

来自the FTP RFC

   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).

所以是的,您应该使用getbinaryfile代替。

两者之间的主要实际区别是二进制模式不会进行行结束转换。如果源系统是基于ECDIC的或备用字大小,gettextfile会将文件即时转换为ASCII。遇到不符合预期编码的字符很容易引发您遇到的那种问题。

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

如果没有文本示例,文件的前两个字节以及十六进制转储中的文本示例,很难帮助您。

而且,毕竟,使用cURLCurb gem来检索文件可能更容易。 cURL非常灵活,功能强大,可以为您提供所需的工具。