16407


WindowsからIBM i上に存在するソースコードをFTPで一括して取得しようと考えていますが、  
mgetコマンドを使用するとファイル中の日本語部分が文字化けします。  
getコマンドを使用した場合はこの問題は起こらず、mgetコマンドを使用したときのみ起こります。  
これを文字化けしないで取得する方法はないでしょうか？

実行したFTPコマンドは以下の通りです。

[code]

    ID
    PASSWORD
    QUOTE SITE NAMEFMT 1
    QUOTE TYPE B 1
    CD /QSYS.LIB/QXXXLIB.LIB/TEST.FILE/
    PROMPT OFF
    MGET *.MBR
    QUIT
    
[/code]

上記コードの`MGET *.MBR`の部分を`GET HELLO.MBR`に変えると文字化けが起こりません。  
また、IBM i側のファイルの文字コード(CCSID)は5035です。

* * *

追記  
debugモードでのログを記載します。

[code]

    ftp> debug
    デバッグ オン。
    ftp> quote site namefmt 1
    ---> site namefmt 1
    250  NOW USING NAMING FORMAT "1".
    ftp> quote type b 1
    ---> type b 1
    200 REPRESENTATION TYPE IS SHIFT JIS KANJI.
    ftp> cd /qsys.lib/QXXXSRC.lib/TEST.file/
    ---> CWD /qsys.lib/QXXXSRC.lib/TEST.file/
    250 "/QSYS.LIB/QXXXSRC.LIB/TEST.FILE" IS CURRENT DIRECTORY.
    ftp> prompt off
    対話モード オフ。
    ftp> mget *.mbr
    ---> TYPE A
    ---> PORT 192,168,***,***,195,100
    ---> NLST *.mbr
    ---> TYPE A
    200 REPRESENTATION TYPE IS ASCII NONPRINT.
    ---> PORT 192,168,***,***,195,101
    200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
    ---> RETR A.MBR
    150 RETRIEVING MEMBER A IN FILE TEST IN LIBRARY QXXXSRC.
    226 FILE TRANSFER COMPLETED SUCCESSFULLY.
    ftp: 197 バイトが受信されました 0.00秒 197000.00KB/秒。
    ---> PORT 192,168,***,***,195,102
    200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
    ---> RETR B.MBR
    150 RETRIEVING MEMBER B IN FILE TEST IN LIBRARY QXXXSRC.
    226 FILE TRANSFER COMPLETED SUCCESSFULLY.
    ftp: 197 バイトが受信されました 0.00秒 197.00KB/秒。
    ---> PORT 192,168,***,***,195,103
    200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
    ---> RETR C.MBR
    150 RETRIEVING MEMBER C IN FILE TEST IN LIBRARY QXXXSRC.
    226 FILE TRANSFER COMPLETED SUCCESSFULLY.
    ftp: 41 バイトが受信されました 0.00秒 41000.00KB/秒。
    ---> PORT 192,168,***,***,195,104
    200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
    ---> RETR D.MBR
    150 RETRIEVING MEMBER D IN FILE TEST IN LIBRARY QXXXSRC.
    226 FILE TRANSFER COMPLETED SUCCESSFULLY.
    ftp: 197 バイトが受信されました 0.00秒 197000.00KB/秒。
    ftp> quit
    ---> QUIT
    221 QUIT SUBCOMMAND RECEIVED.
    
[/code]


CC BY-SA 3.0
2015-09-07T04:15:20.530
16340
2015-09-09T01:40:39.430
2015-09-09T00:37:29.627
12195
12195
question
windows 文字化け ftp
IBM iからFTPのMGETコマンドでファイルを取得した際に文字化けが発生する


`prompt off`と`MGET *.MBR`の間に`ascii`というコマンドを入れればうまくいきませんか。

これでうまくいかない場合、IBMにもっと具体的にどのコードで送ってほしいか指示する必要があるのですが、生憎windowsのftpクライアントにはそのようなものはありません。そういった場合、`quote`というコマンドを使って任意の文字列をホストに送ることができます。  
問題は何を送ればいいか、ということなのですが、検索していたらAS400のftpの使い方というページがありました  
<http://publib.boulder.ibm.com/html/as400/v4r5/ic2962/info/RZAIQTYPE.HTM#HDRRZAIQTYPE>  
この`TYPE
B4R`を実行したときにホストに送られるものと同じものを送ればいいのですが、実機が無い場合、うまく転送できるgetのログやトレースなどから推定するか、`remotehelp`などを見ながらあれこれ試すしかありません。  
仮に`TYPE B4R`を入れると`site mode b4r`というコマンドが送られるなら`quote 'site mode
b4r'`のように使います。このあたりから、IBMのサポートに聞く方が早いという解が現実味を帯びてくると思います。

これをやってもだめな場合、それはクライアント側のgetとmgetの機能が違うということなのでftpコマンドを使う限りどうにもなりません。その可能性は決して低くないと思います。


CC BY-SA 3.0
2015-09-08T01:46:55.883
16362
2015-09-08T01:46:55.883
8136
16340
answer


Windows側で文字コードを別途変換出来る手段があるのであれば、バイナリモードでダウンロードした方が確実だと思います。


CC BY-SA 3.0
2015-09-09T00:15:21.117
16403
2015-09-09T00:15:21.117
10115
16340
answer

[code]

    ftp> quote type b 1
    ---> type b 1
    200 REPRESENTATION TYPE IS SHIFT JIS KANJI.
    
[/code]

まではうまくいっているようですが、当初の予想に反し、NLST でファイルのリストを取得した後、

[code]

    ---> NLST *.mbr
    ---> TYPE A
    200 REPRESENTATION TYPE IS ASCII NONPRINT.
    
[/code]

で ASCII モードになってますね。`quote type b 1` が FTP クライアントに type
コマンドの亜種として認識されないので、よくよく考えれば不思議な動作ではないですね。

考えうる対処としては

  1. binary で転送して、Windows 上で文字コード変換
  2. `mget` の前後で発行するコマンドを細かく制御できる FTP クライアントを使う
  3. `ls` コマンドを使ってファイルリストを取得し、それを自前でパースし逐次 get コマンドで取得するような .BAT なり PowerShell を書く
  4. Ruby やら Python といった LL を使う

あたりでしょうか。ご自分の仕事環境で一番楽な方法を選べばいいと思います。


CC BY-SA 3.0
2015-09-09T01:24:06.533
16407
2015-09-09T01:24:06.533
2521
16340
answer


自己回答  
Windows側からIBM i側へ`mget`するのではなく、  
IBM i側からWindows側へ`ltype c 943`コマンドを使用した後で`mput`することで  
文字化けせずに転送することが可能。


CC BY-SA 3.0
2015-09-09T01:40:39.430
16408
2015-09-09T01:40:39.430
12195
16340
answer