我有一个通过FTP从大型机获取平面文件的进程。这通常可以正常工作,但不时的文件将包含一些重音字符。如果我尝试获取包含重音的文件,整个过程将失败,并显示以下错误:Encoding::UndefinedConversionError: "\x88" from ASCII-8BIT to UTF-8
那是使用Net::FTP
的{{1}}方法。许多人建议只需切换到gettextfile
- 这样做可以让我下载文件,但是生成的文件是我无法解析的东西(说它是UTF-8,但内容没有意义)
有没有办法简单地将文件提取并保存为ASCII而不必让rails自动将输出转换为UTF-8?这是我的代码:
getbinaryfile
答案 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中编码。这是处理备用操作系统和硬件非常烦人的地方。
如果没有文本示例,文件的前两个字节以及十六进制转储中的文本示例,很难帮助您。