1

我正在尝试使用 Ruby 的 Net::FTP 类从远程服务器下载某些文件,这是我的代码

require 'net/ftp'
ftp = Net::FTP.new
ftp.connect('mydomain', '21')
ftp.login('username', 'password')
ftp.passive = true

  ftp.chdir("testing")

  ftp.getbinaryfile('個人情報.csv', 'test1.csv')
  puts "#{Time.now} > Downloaded 個人情報.csv."

  ftp.getbinaryfile('住所.csv', 'test2.csv')
  puts "#{Time.now} > Downloaded 住所.csv"

ftp.close

我收到以下错误

$ ruby ftp_download.rb

/usr/local/lib/ruby/2.3.0/net/ftp.rb:340:in `getresp': 451 No mapping for the Unicode character exists in the target multi-byte code page.  (Net::FTPTempError)
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:367:in `block in sendcmd'
    from /usr/local/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:365:in `sendcmd'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:424:in `transfercmd'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:501:in `block (2 levels) in retrbinary'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:214:in `with_binary'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:499:in `block in retrbinary'
    from /usr/local/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:498:in `retrbinary'
    from /usr/local/lib/ruby/2.3.0/net/ftp.rb:632:in `getbinaryfile'
    from ftp_download.rb:26:in `<main>'

tagrget 文件是SJIS编码的。
我究竟做错了什么 ?非常感谢任何帮助!谢谢

4

1 回答 1

1

错误消息来自 FTP 服务器。问题是 FTP 服务器无法解释这些 un​​icode 文件名。请检查是否为连接启用了 UTF8 功能。

从stackoverflow上的现有答案:

仅将字符串编码为 UTF8 并将其作为文件名发送到 FTP 服务器是不够的。过去,所有 FTP 服务器都只理解 ASCII,而现在为了保持向后兼容性——即使它们能够识别 Unicode——当它们启动时,它们也将所有文件名都视为 ASCII。

为了使这一切正常工作,您(您的程序)必须首先检查您的服务器的能力。服务器在客户端连接后发送其功能 - 在您的情况下,您必须检查FEAT UTF8。如果您的服务器发送它 - 这意味着它理解 UTF8。尽管如此 - 即使它理解它 - 你必须明确告诉它,从现在开始你将发送你的文件名 UTF8 编码,现在它是你的程序缺少的东西(因为你的服务器支持你所说的 utf8)。

您的客户端必须向 FTP 服务器发送以下OPTS UTF8 ON。发送后,您可以使用 UTF8 或对您的服务器说 UTF8-ish(可以这么说)。

阅读此处了解详细信息文件传输协议的国际化

资料来源:

https://stackoverflow.com/a/19903611/1305200

https://wiki.filezilla-project.org/Character_Encoding

于 2016-09-09T08:48:55.490 回答