Ale*_*ger 10 ruby ftp encoding ruby-on-rails
我有一个通过FTP从大型机中获取平面文件的进程.这通常可以正常工作,但不时的文件将包含一些重音字符.如果我尝试获取包含重音的文件,整个过程将失败并显示以下错误:Encoding::UndefinedConversionError: "\x88" from ASCII-8BIT to 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
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,FTP-dom 中的文本文件是 ASCII-7 位,不能包含具有高位设置的字符,即 ASCII-8BIT。重音字符,即使是扩展 ASCII 或 8BIT 或任何我们想要调用的 0x7F 以上的字符,都需要以二进制模式传输。
来自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).
Run Code Online (Sandbox Code Playgroud)
所以是的,你应该改用getbinaryfile
。
两者之间的主要实际区别是二进制模式不会进行行尾转换。如果源系统是基于 ECDIC 的或替代字大小的,gettextfile
则会将文件动态转换为 ASCII。遇到不符合预期编码的字符很容易引发您所看到的问题。
如果使用 传输后文件没有任何意义getbinaryfile
,则它可能位于大型机上的替代代码集而不是 UTF8 中。您必须弄清楚它在该系统上的代码集,并在下载后使用适当的编码设置打开文件。您可以file
在 *nix 系统上使用该命令对文件的编码进行有根据的猜测,但这不是详尽的测试,并且可能会产生误导。由于文件来自大型机,因此它可能使用不同的字长,例如 UTF-16BE、UTF-32LE 或以 EBCDIC 进行编码。这就是处理备用操作系统和硬件变得非常烦人的地方。
如果没有文本示例、文件的前两个字节以及十六进制转储中的文本样本,就很难为您提供帮助。
而且,毕竟,使用cURL或Curb gem 来检索文件可能会更容易。cURL 非常灵活且功能强大,可能会为您提供所需的工具。
归档时间: |
|
查看次数: |
608 次 |
最近记录: |