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 サーバーがこれらの Unicode ファイル名を解釈できないことです。接続で UTF8 機能が有効になっているかどうかを確認してください。

stackoverflow に関する既存の回答から:

文字列を UTF8 としてエンコードし、ファイル名として FTP サーバーに送信するだけでは十分ではありません。過去には、すべての FTP サーバーは ASCII のみを理解していましたが、現在では下位互換性を維持するために (たとえ Unicode を認識していても)、起動時にすべてのファイル名も ASCII として扱います。

それをすべて機能させるには、あなた(あなたのプログラム)はまずあなたのサーバーの能力をチェックしなければなりません。サーバーは、クライアントが接続した後に機能を送信します。この場合、FEAT UTF8を確認する必要があります。サーバーがそれを送信する場合、それは UTF8 を理解していることを意味します。それにもかかわらず、たとえそれが理解できたとしても、今後はUTF8でエンコードされたファイル名を送信することを明示的に伝える必要があり、これはプログラムに欠けているものです(サーバーはあなたが述べたようにutf8をサポートしているため)。

クライアントは、次のOPTS UTF8 ONを FTP サーバーに送信する必要があります。それを送信した後、UTF8を使用するか、UTF8っぽい(いわば)サーバーに話すことができます。

詳細はこちらファイル転送プロトコルの国際化

ソース:

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

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

于 2016-09-09T08:48:55.490 に答える