C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VB.netで全角を含むURLのFTP接続について


(過去ログ 82 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■48516 / inTopicNo.1)  VB.netで全角を含むURLのFTP接続について
  
□投稿者/ いただっく (1回)-(2010/04/08(Thu) 11:13:35)

分類:[.NET 全般] 

いつもお世話になっております。

現在の環境は以下の通りです。

Windows XP sp3
Microsoft Visual Studio 2008 Pro
Microsoft .NET Framework Version 3.5 SP1


早速ですが、質問です。
現在FTPのファイル一覧を取得するツールを作成中ですが、「全角が含まれる」URLの時に
一覧が取得できない時があり行き詰っています。


☆パターン1【ftp://123.456.789.012/test/ああああ】
結果:正常に「ああああ」の直下のフォルダが表示される

接続先(AbsoluteUri)    : ftp://123.456.789.012/test/%E7%B8%BA%E3%82%85%E2%89%A0%E7%B8%BA%E3%82%85%E2%89%A0
接続先(OriginalString) : ftp://123.456.789.012/test/縺ゅ≠縺ゅ≠

drwxr-xr-x    * 0        0            **** Apr 07 08:22 TEST

ClosingData: 226 Directory send OK.



☆パターン2【ftp://123.456.789.012/test/ああああ/いいいい】
結果:「いいいい」の直下のフォルダが表示されないが、結果は「226」が戻る。
接続先(AbsoluteUri)    : ftp://123.456.789.012/test/%E7%B8%BA%E3%82%85%E2%89%A0%E7%B8%BA%E3%82%85%E2%89%A0/%E7%B8%BA%E3%83%BB%EF%BC%9E%E7%B8%BA%E3%83%BB%EF%BC%9E
接続先(OriginalString) : ftp://123.456.789.012/test/縺ゅ≠縺ゅ≠/縺・>縺・>
ClosingData: 226 Directory send OK.

※ステータスコード=226 … Closingデータ接続。 正常な要求されたファイル処置(例えば; ファイル・トランスファーかファイル異常終了)。 


上記の結果を踏まえて不明な点が3点あります。

1.パターン1で正常に一覧が取得できているので、エンコード等はあっていると思っているのですが、
  なぜ、パターン2では正常にデータが取得できないのか? (縺・>の中点(・)が悪さをしている・・・?)

2.AbsoluteUriは、UTF-8の16進数に変換されているが、このURLをIE等では接続できない。

  SHIF-JIS ftp://123.456.789.012/test/%E3%81%82%E3%81%82%E3%81%82%E3%81%82/ ⇒ ツールではこのURLで接続にいくと一覧が表示されない
  UTF-8    ftp://123.456.789.012/test/%E7%B8%BA%E3%82%85%E2%89%A0%E7%B8%BA%E3%82%85%E2%89%A0 ⇒ IEでは接続できないが、ツールはこのURLで接続にいっている?

3.そもそも「ftpRes.ResponseUri.AbsoluteUri」のURLで接続にいっているのでしょうか?

4.「226 Directory send OK.」と帰ってきている以上、実はフォルダの一覧が取得できている・・・?


数日格闘致しましたが万策つきました。
よろしければ皆様のお知恵をお貸し下さい。
長文失礼しました。


参考サイト
ttp://dobon.net/vb/dotnet/internet/ftpwebrequest.html
ttp://bbs.wankuma.com/index.cgi?mode=al2&namber=42964&KLOG=73


*********** 以下ソース ************

'===============================================
' FTPサーバへの接続
'===============================================
Private Sub S_Connect()

    'URL(自作関数にて全角をUTF8に変換。関数は下に記載)
    Dim u As New Uri("ftp://123.456.789.012/test/" & F_ChangeZen16("ああああ"))             'パターン1
    'Dim u As New Uri("ftp://123.456.789.012/test/" & F_ChangeZen16("ああああ/いいいい"))   'パターン2

    'FtpWebRequestの作成
    Dim ftpReq As System.Net.FtpWebRequest = System.Net.WebRequest.Create(u)

    'ログインユーザー名とパスワードを設定
    ftpReq.Credentials = New System.Net.NetworkCredential("user", "pass")

    '指定されたURLのフォルダ一覧を取得
    ftpReq.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails

   ftpReq.KeepAlive = False        '要求の完了後に接続を閉じる
   ftpReq.UseBinary = False        'ASCIIモードで転送する
   ftpReq.UsePassive = False       'PASSIVEモードを無効にする

    'FtpWebResponseを取得
    Dim ftpRes As System.Net.FtpWebResponse
    ftpRes = CType(ftpReq.GetResponse(), System.Net.FtpWebResponse)

    Console.WriteLine("接続先(AbsoluteUri)    : " & ftpRes.ResponseUri.AbsoluteUri)
    Console.WriteLine("接続先(OriginalString) : " & ftpRes.ResponseUri.OriginalString)

    'FTPサーバーから送信されたデータを取得
    Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(65001)
    Dim sr As New System.IO.StreamReader(ftpRes.GetResponseStream(), enc)

    While sr.Peek > -1
        'ファイル一覧を表示
        Console.WriteLine(sr.ReadLine)
    End While

    sr.Close()

    'FTPサーバーから送信されたステータスを表示
    Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription)
End Sub


'===============================================
' 全角PATH変換処理
'===============================================
Private Function F_ChangeZen16(ByVal p_strPath As String) As String
    Dim bytesData As Byte()                 '全角文字をUTF8で変換
    Dim byteSumData(-1) As Byte             'bytesDataを溜め込んでいく

    Dim strHenkanGo As String = ""          '変換後全角文字格納用
    Dim strReturnPath As String = ""        '戻り値

    Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")

    For i As Integer = 1 To p_strPath.Length
        'URLを1文字ごとにチェックする
        Dim str1mojiPath As String = Mid(p_strPath, i, 1)

        '文字のバイト数にて、半角全角を判断
        Dim intByteCount As Integer = enc.GetByteCount(str1mojiPath)

        '全角の時
        If intByteCount = 2 Then

            'UTF-8に変換(10進数)
            bytesData = System.Text.Encoding.UTF8.GetBytes(str1mojiPath)

            '配列の結合(URLに全角が続いた時の為)
            Dim intSumData As Integer = byteSumData.Length
            ReDim Preserve byteSumData(intSumData + bytesData.Length - 1)
            bytesData.CopyTo(byteSumData, intSumData)

            'SHIFT-JISに変換
            strHenkanGo = System.Text.Encoding.GetEncoding(932).GetString(byteSumData)

        '半角の時
        Else
            strReturnPath = strReturnPath & strHenkanGo & str1mojiPath

            '全角用の変数をイニシャル
            strHenkanGo = ""
            ReDim byteSumData(-1)
        End If
    Next

    strReturnPath = strReturnPath & strHenkanGo

    Return strReturnPath
End Function

引用返信 編集キー/
■48541 / inTopicNo.2)  Re[1]: VB.netで全角を含むURLのFTP接続について
□投稿者/ 魔界の仮面弁士 (1602回)-(2010/04/08(Thu) 15:11:05)
No48516 (いただっく さん) に返信
> 現在の環境は以下の通りです。
> Windows XP sp3
> Microsoft Visual Studio 2008 Pro
> Microsoft .NET Framework Version 3.5 SP1
FTP サーバー側の環境はわかりますか?


> 1.パターン1で正常に一覧が取得できているので、エンコード等はあっていると思っているのですが、
運良く化けずに取得できる事があるというだけで、手順そのものは正しく無いと思います。
「そのサーバーにとって正しい方法」を選択する必要がありますが、相手が IIS 以外のサーバーの場合、
その正しい方法を、FtpWebResponse で実装できるかどうかは分かりません。


>   なぜ、パターン2では正常にデータが取得できないのか? (縺・>の中点(・)が悪さをしている・・・?)
「縺ゅ≠縺ゅ≠」のように、"縺" や "繧" が繰り返し現れる化け方というのは、
UTF-8 でエンコードされたバイナリを、本来の UTF-8 でデコードせずに
Shift_JIS でデコードした場合の典型的な化け方です。


"ああ" という文字列の場合、
 UTF8 : E3,81,82,E3,81,82
 SJIS : 82,A0,82,A0
というバイナリにエンコードされます。

この時、正しいデコーダが選ばれれば元の「ああ」に戻せますが、
E3,81,82,E3,81,82 を、誤って Shift_JIS として処理してしまうと、
 "E381" → "縺"
 "82E3" → "ゅ"
 "8182" → "≠"
という文字列に化けてしまう事になります。


一方、"いい"の場合は、
 UTF8 : E3,81,84,E3,81,84
 SJIS : 82,A2,82,A2
となります。そして E3,81,84,E3,81,84 が Shift_JIS として扱われた場合、
 "E381" → "縺"
 "84E3" → Shift_JIS のエリア内だが、文字は割り当てられていない
 "8184" → ">"
という文字列と認識されます。一応、この時点ではデータはまだ破損していませんが、
ここからさらに Unicode 変換が行われますので、この段階で『・』などの文字に
代替され、その結果、データとしては破損する事になります。


> 2.AbsoluteUriは、UTF-8の16進数に変換されているが、このURLをIE等では接続できない。
>   SHIF-JIS ftp://123.456.789.012/test/%E3%81%82%E3%81%82%E3%81%82%E3%81%82/ ⇒ ツールではこのURLで接続
>   UTF-8    ftp://123.456.789.012/test/%E7%B8%BA%E3%82%85%E2%89%A0%E7%B8%BA%E3%82%85%E2%89%A0 ⇒ IEでは接続できないが、ツールはこのURLで接続にいっている?
# そもそも 123.456.789.012 というアドレスが NG ですが、それは本題では無いので無視するとして。

接続先のFTPサーバーや、使用しているFTPクライアントによって多少の差異がありますが、
たとえば、日本語版 IIS 5.1 の FTP サーバー機能の場合、IE8環境のエクスプローラーからは
   ftp://localhost/test/%82%A0%82%A0%82%A0%82%A0/%82%A2%82%A2%82%A2%82%A2/
のアドレスで接続する事ができますが、FtpWebRequest の場合には、
   Dim u1 As New Uri("ftp://localhost/test/ああああ/いいいい")
   Dim u2 As New Uri("ftp://localhost/test/%E3%81%82%E3%81%82%E3%81%82%E3%81%82/%E3%81%84%E3%81%84%E3%81%84%E3%81%84")
のいずれかで接続できます。(IIS 以外のサーバーでは、別の指定方法になるかも知れません)


> 3.そもそも「ftpRes.ResponseUri.AbsoluteUri」のURLで接続にいっているのでしょうか?

強いて言えば AbsoluteUri の方ですが、そもそも実際の FTP 処理では、%FF%FF…形式の文字列は使われていないはずです。
FTP.EXE をデバッグモード(-d オプション)で使ったことがあれば分かるかと思いますが、
内部的には、たとえば以下のようなデータ交換が行われる事になります(細かい点は端折っています)。

→クライアントから接続要求。
←サーバーから "220" が返され、アカウント入力待ちになる。
→クライアントから "USER アカウント名" コマンドが渡される。
←サーバーから "331" が返され、パスワード入力待ちになる。
→クライアントから "PASS パスワード" コマンドが平文で渡される。
←サーバーから "230" が返され認証成功。入力待ちになる。
→クライアントから "LIST test/ああああ/いいいい" コマンドが渡される。≪ %FF%FF 形式では無い
←サーバーから "150" が返されデータ接続がオープンされる。
←サーバーからデータポートにファイルの一覧が渡される。
 なおこの一覧の形式はサーバーによって異なっており、統一された仕様は無い。
←サーバーから "226" が返されデータ接続がクローズされた事が通知される。
→クライアントから "QUIT" コマンドが渡される。これにより、サーバーからログアウトされる。


この場合の問題は、"LIST test/ああああ/いいいい" が送出される際の文字コードです。

というのも、FTP の仕様そのものがマルチバイト文字を考慮した設計にはなっていないため、
日本語ファイル名がどのように送出されるかは、それぞれの実装に依存しているからです。

しかも FtpWebRequest の場合、FtpWebResponse.GetResponseStream() に対して Encoding を指定して
文字列にデコードする事はできるものの、コマンドの文字コードを指定する機能は用意されていないようです。


> 4.「226 Directory send OK.」と帰ってきている以上、実はフォルダの一覧が取得できている・・・?
FTP サーバー側のログを確認してみてください。中には、指定していたパスが間違っていた場合にも
空の一覧を返して、コマンド自体は正常とみなす実装もあるかも知れません。
あるいは本当に "縺ゅ≠縺ゅ≠/縺・>縺・" という名前のディレクトリがサーバー側に存在していた、とか。


> Dim bytesData As Byte()
> Dim byteSumData(-1) As Byte
『Dim 変数名() As 型名』表記の配列宣言と、
『Dim 変数名 As 型名()』表記が混在していますね。

意味は同じですが、どちらかに統一しておいた方が良いと思いますよ。

引用返信 編集キー/
■48592 / inTopicNo.3)  Re[2]: VB.netで全角を含むURLのFTP接続について
□投稿者/ いただっく (2回)-(2010/04/09(Fri) 09:35:57)
No48541 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士様、お返事ありがとうございます。
詳しい解説ありがとうございます。

> FTP サーバー側の環境はわかりますか?
FTPサーバは「CentOS」を使用していますが、
客先の駐在業務の為、サーバの詳しい環境は不明です。

> 「そのサーバーにとって正しい方法」を選択する必要がありますが、相手が IIS 以外のサーバーの場合、
> その正しい方法を、FtpWebResponse で実装できるかどうかは分かりません。
やはりFTPサーバー側の環境の調査が必須ということですよね。
「CentOS」自体あまり知らないのでまずはそこからはじめたいと思います。


> UTF-8 でエンコードされたバイナリを、本来の UTF-8 でデコードせずに
> Shift_JIS でデコードした場合の典型的な化け方です。
このへんのエンコ関連に関しては知識が(一応)あります。
なので、euf-8で接続できないのが不思議だったのです。


> # そもそも 123.456.789.012 というアドレスが NG ですが、それは本題では無いので無視するとして。
もちろんサンプルIPなのでお気になさらずにお願い致します。


> 接続先のFTPサーバーや、使用しているFTPクライアントによって多少の差異がありますが、
> たとえば、日本語版 IIS 5.1 の FTP サーバー機能の場合、IE8環境のエクスプローラーからは
> ftp://localhost/test/%82%A0%82%A0%82%A0%82%A0/%82%A2%82%A2%82%A2%82%A2/
> のアドレスで接続する事ができますが、FtpWebRequest の場合には、
> Dim u1 As New Uri("ftp://localhost/test/ああああ/いいいい")
> Dim u2 As New Uri("ftp://localhost/test/%E3%81%82%E3%81%82%E3%81%82%E3%81%82/%E3%81%84%E3%81%84%E3%81%84%E3%81%84")
> のいずれかで接続できます。(IIS 以外のサーバーでは、別の指定方法になるかも知れません)
MS製のIISならやはり「ftp://localhost/test/ああああ/いいいい」と全角のPATHを送信しても大丈夫なんですね。


>>3.そもそも「ftpRes.ResponseUri.AbsoluteUri」のURLで接続にいっているのでしょうか?
>
> 強いて言えば AbsoluteUri の方ですが、そもそも実際の FTP 処理では、%FF%FF…形式の文字列は使われていないはずです。
「強いて」ということは、VB側でURLはAbsoluteUriだが、FTP処理をかける際には更に変換されているということですか。


> FTP.EXE をデバッグモード(-d オプション)で使ったことがあれば分かるかと思いますが、
> 内部的には、たとえば以下のようなデータ交換が行われる事になります(細かい点は端折っています)。
最終的なやりとりは(RequestやResponse)は環境が異なっても上記みたいにやりとりされているんですね。
勉強になりました。

> しかも FtpWebRequest の場合、FtpWebResponse.GetResponseStream() に対して Encoding を指定して
> 文字列にデコードする事はできるものの、コマンドの文字コードを指定する機能は用意されていないようです。
なるほど・・・Responseはこちら側でなんとでもなるが、Requestする際は、FTPサーバの環境に変換した文字コードで
送信する必要がある!ということですね。


> FTP サーバー側のログを確認してみてください。
サーバのログは上記の通り客先駐在なのでそこまで見ることはできませんが、

> 中には、指定していたパスが間違っていた場合にも空の一覧を返して、コマンド自体は正常とみなす実装もあるかも知れません。
パスが存在しない=空フォルダ と返しているのかも知れませんね。


> 『Dim 変数名() As 型名』表記の配列宣言と、
> 『Dim 変数名 As 型名()』表記が混在していますね。
>
> 意味は同じですが、どちらかに統一しておいた方が良いと思いますよ。
以後気をつけたいと思います。




まだ解決には至っていませんので、引き続きよろしくお願い致します。

引用返信 編集キー/
■48594 / inTopicNo.4)  Re[3]: VB.netで全角を含むURLのFTP接続について
□投稿者/ よねKEN (466回)-(2010/04/09(Fri) 10:28:28)
補足というかツッコミだけですが、

No48592 (いただっく さん) に返信
>>FTP サーバー側の環境はわかりますか?
> FTPサーバは「CentOS」を使用していますが、
> 客先の駐在業務の為、サーバの詳しい環境は不明です。

魔界の仮面弁士さんの確認されている”FTPサーバ”というのは、
vsftpdやProFTPDといったFTPサービスを提供するプログラムのことだと思いますが、
ここの認識は一致していますでしょうか?例えば、FTPサーバ機の環境を説明する場合
「OSはWindows Server 2008、FTPサーバはIIS7.0」や
「OSはCentOS ???、FTPサーバはvsftpd ???」(vsftpdは例です。???はバージョン)のようになります。

#「サーバの詳しい環境は不明」という話がFTPサービスのプログラムを何を使用しているかがわからない、
#という意味なら、余計な指摘です。ごめんなさい。その場合はこの発言はスルーしてください。

> 「CentOS」自体あまり知らないのでまずはそこからはじめたいと思います。

CentOSはLinuxのディストリビューションの1つですね。
・文字コード周りだとLinuxの環境変数のLangがどうなっているか
(最近だとUTF8が多いけれど、まだまだEUCの設定のところも多い)
・使用してるFTPサービスの文字コードの扱いが、環境変数の設定に従うのか、
あるいは、そのサービス自身で勝手に決めているのか)
といったあたりを押さえるとよいと思います。

> サーバのログは上記の通り客先駐在なのでそこまで見ることはできませんが、

そのFTPサーバ機は常駐先の管理下にないということでしょうか?
客先のさらに取引先のFTPサーバとかだったら、難しいかもしれませんが、
自分の客先の管理下にあるものであれば、お客様に事情を説明して、
環境情報を教えてもらったり、ログを見せてもらったり、という要請も必要かなと思います。
引用返信 編集キー/
■48595 / inTopicNo.5)  Re[3]: VB.netで全角を含むURLのFTP接続について
□投稿者/ 魔界の仮面弁士 (1606回)-(2010/04/09(Fri) 11:50:51)
No48592 (いただっく さん) に返信
>># そもそも 123.456.789.012 というアドレスが NG ですが、それは本題では無いので無視するとして。
> もちろんサンプルIPなのでお気になさらずにお願い致します。
IP なのに 255 を超えた値が記載されていたので、気になってしまいました。(^^;


> MS製のIISならやはり「ftp://localhost/test/ああああ/いいいい」と全角のPATHを送信しても大丈夫なんですね。
そうとも言い切れないと思います。IIS との間では ANSI が使われることになるため、
たとえば中国語のファイル名やディレクトリ名を送受信する事はできません。
http://support.microsoft.com/kb/332093/ja

実際、当方環境で "ニイハオ" の漢字 2 文字({イ+尓};{好})を使ったファイル名を
LIST コマンドで受信してみたところ、"?好.txt" を意味する 3F/8D,44/2E/74/75/74 の
バイナリが受信されました。(ちなみに "ああ.TXT" では 82,A0/82,A0/2E/54/58/54。)


>>> 3.そもそも「ftpRes.ResponseUri.AbsoluteUri」のURLで接続にいっているのでしょうか?
>> 強いて言えば AbsoluteUri の方ですが、そもそも実際の FTP 処理では、%FF%FF…形式の文字列は使われていないはずです。
> 「強いて」ということは、VB側でURLはAbsoluteUriだが、
これは、No48541 の u1 / u2 変数でチェックしたときに、そのどちらでも通信が成功し、
かつ、両者の AbsoluteUri が同一であったことからの推測です。(当然、OriginalString は異なる)

> FTP処理をかける際には更に変換されているということですか。
FtpWebRequest の内部実装を追ったわけではないので、実際の所はどうだか分かりませんが、
少なくとも通信内容をキャプチャーしてみたところ、先のような結果が得られました。

なお正確に言えば、先述した
>> ←サーバーから "230" が返され認証成功。入力待ちになる。
>> →クライアントから "LIST test/ああああ/いいいい" コマンドが渡される。≪ %FF%FF 形式では無い
この部分(ログイン直後)に、クライアントから "OPTS utf8 on" というコマンドも送出されていました。
サーバーからは未サポートを示す "501" が返されていたので、処理としては無視されたようですけれどね。


> 最終的なやりとりは(RequestやResponse)は環境が異なっても上記みたいにやりとりされているんですね。
> 勉強になりました。
やりとりの内容については、Microsoft ネットワーク モニタでキャプチャできます。
http://blogs.technet.com/netmon/

FTP そのものの仕様については、RFC959、RFC2640 等で確認してみて下さい。


> Requestする際は、FTPサーバの環境に変換した文字コードで
> 送信する必要がある!ということですね。
FtpWebRequest 以外の対処方法としては、Socket クラスで FTP クライアントを自力実装するとか。


>>中には、指定していたパスが間違っていた場合にも空の一覧を返して、コマンド自体は正常とみなす実装もあるかも知れません。
> パスが存在しない=空フォルダ と返しているのかも知れませんね。
実際のところはどうでしたか? (私は CentOS の事を知りませんので、真偽を検証できません)
明らかに存在しないフォルダ(というかディレクトリ)のパスを、意図的に指定する事は容易ですよね。
引用返信 編集キー/
■48598 / inTopicNo.6)  Re[4]: VB.netで全角を含むURLのFTP接続について
□投稿者/ 魔界の仮面弁士 (1607回)-(2010/04/09(Fri) 12:01:22)
No48594 (よねKEN さん) に返信
>>FTPサーバは「CentOS」を使用していますが、
>>客先の駐在業務の為、サーバの詳しい環境は不明です。
> 魔界の仮面弁士さんの確認されている”FTPサーバ”というのは、
> vsftpdやProFTPDといったFTPサービスを提供するプログラムのことだと思いますが、
> ここの認識は一致していますでしょうか?
質問の意図としてはそうなのですが、非Winサーバーである時点で、正直、私だと手に余ります。(汗
たとえ vsftpd がそのまま使われているのだとしても、こちらにはその環境が無いので。。。

# 識者の登場に期待

> 自分の客先の管理下にあるものであれば、お客様に事情を説明して、
> 環境情報を教えてもらったり、ログを見せてもらったり、という要請も必要かなと思います。
そうですね。私も、AS/400相手のFTPクライアント機能を(VB6で)組んだ際に、同様の要請を行いました。

> 客先のさらに取引先のFTPサーバとかだったら、難しいかもしれませんが、
むぅ…。
引用返信 編集キー/
■48627 / inTopicNo.7)  Re[4]: VB.netで全角を含むURLのFTP接続について
□投稿者/ ???????? (2回)-(2010/04/10(Sat) 12:44:26)
No48595 (魔界の仮面弁士 さん) に返信
> ■No48592 (いただっく さん) に返信
>>MS製のIISならやはり「ftp://localhost/test/ああああ/いいいい」と全角のPATHを送信しても大丈夫なんですね。
> そうとも言い切れないと思います。IIS との間では ANSI が使われることになるため、
> たとえば中国語のファイル名やディレクトリ名を送受信する事はできません。
> http://support.microsoft.com/kb/332093/ja

すくなくともIIS7.0は
opt utf-8 on
に対応しています。

> なお正確に言えば、先述した
> >> ←サーバーから "230" が返され認証成功。入力待ちになる。
> >> →クライアントから "LIST test/ああああ/いいいい" コマンドが渡される。≪ %FF%FF 形式では無い
> この部分(ログイン直後)に、クライアントから "OPTS utf8 on" というコマンドも送出されていました。
> サーバーからは未サポートを示す "501" が返されていたので、処理としては無視されたようですけれどね。

FtpWebRequestは「opts utf8 on」が成功するとUTF-8を用いて送受信を行います。
失敗した場合はEncoding.Defaultを用いて送受信を行います。
普通の日本語Windowsの場合、これはShift-JISです。

なのでまとめると。

・「opt utf-8 on」に対応したサーバー OK
・「opt utf-8 on」に対応していないサーバー
 ・クライアントのANSIコードページとサーバーのencodingが同じ OK
 ・クライアントのANSIコードページとサーバーのencodingが違う NG

です。
対応策は

1) 「ANSIコードページでencodeした後、サーバーのencodingでdecodeしたら正しい文字列になる」ような特殊なencodeを施したURIを使う。
2) ANSIコードページを切り替える
3) エンコードを変更するプロキシを通す
4) FTPクライアントを自作する
5) FTPWebRequestをごにょごにょする

等があります。
「相手に文句を言う」といった社会的な方法もあるかと思います。

ちなみに、1)はShift-JISでは不可能でした。
2)は知りません。
3)は既製品を知りませんので、自作することになります。作り方によっては4)の方が楽になります。
4)が一番オススメです。WebRequestで自作のFTPクライアントを使いたい場合はごにょごにょする必要があります。
私は5)を使っていますが、いろいろめんどくさくてオススメできません。

引用返信 編集キー/
■48628 / inTopicNo.8)  Re[5]: VB.netで全角を含むURLのFTP接続について
□投稿者/ れい (893回)-(2010/04/10(Sat) 12:46:27)
No48627 (???????? さん) に返信

この投稿は私です。
Opera最新版だといつも名前が化けます。

めんどくさい。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -