tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWin32APIのFTPクライアントについて
記事No13448
投稿日: 2009/02/20(Fri) 10:39
投稿者王鵬
FipFindFirstFileでファイル名を呼び出すときに
ファイル名が文字化けしてしまい正しいファイル名を取得できません。
解決方法をご存知の方がおられましたら宜しくお願い致します。

[ツリー表示へ]
タイトルRe: Win32APIのFTPクライアントについて
記事No13449
投稿日: 2009/02/20(Fri) 10:53
投稿者魔界の仮面弁士
# 回答に非ず

> FipFindFirstFileで
 FtpFindFirstFile、ですよね。

> ファイル名を呼び出すときに
> ファイル名が文字化けしてしまい正しいファイル名を取得できません。

まず前提条件として:

FTP のプロトコルによる「ファイル名の列挙」機能は、どちらかというと
対 人間用に設計されたものであり、コンピュータでの判読は面倒な部類です。

・そもそも、どの文字コードを使うべきかが定められていない。
・ファイル情報がどのような形式で返されるのかは、サーバーによってまちまち。

そのため、FipFindFirstFile も万能には使えません。

Microsoft の FTP サーバー(IIS、PWSなど)であれば対応しているようですが、
他社のサーバー全てに対応しているわけでは無いという事です。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200705/07050007.txt


もし、LIST の形式が WinInet.dll が判読可能な形式でなかった場合、
現在の方法は諦めて、別の FTP 手法に切り替える必要があるかも知れません。

[ツリー表示へ]
タイトルRe^2: Win32APIのFTPクライアントについて
記事No13450
投稿日: 2009/02/20(Fri) 11:47
投稿者王鵬
FtpFindFirstFile、ですよね。
そうです、すみません。

今、FTPサーバーがSERV-Uです。
サーバーにああ.txtがあります。

FtpFindFirstFileで呼び出して、縺ゅ≠.txtになりました。

何が使って、変換できませんか。

[ツリー表示へ]
タイトルRe^3: Win32APIのFTPクライアントについて
記事No13451
投稿日: 2009/02/20(Fri) 12:13
投稿者魔界の仮面弁士
> FtpFindFirstFileで呼び出して
API の宣言部分と、呼び出し部分を見せてもらえますか?


> サーバーにああ.txtがあります。
> FtpFindFirstFileで呼び出して、縺ゅ≠.txtになりました。
「ああ.txt」を、UTF-8 でエンコードすると、
 E38182 E38182 2E 74 78 74
になります。

「縺ゅ≠.txt」を、Shift_JIS でエンコードしたものも、
 E381 82E3 8182 2E 74 78 74
という同じバイナリになります。

つまり UTF-8 テキストが、Shift_JIS としてデコードされている状態ですね。


> 何が使って、変換できませんか。
事後変換は避けましょう。
化けたデータを元に戻すのではなく、化けずに受け取る事を考えるべきです。


ADODB.Stream 等を使えば、「縺ゅ≠.txt」→「ああ.txt」への変換は可能ですが、
それは運が良かっただけです。今回は、データの損失がありませんでしたが、
他の文字列では変換できる保証はありません。


たとえば、元ファイルが「β版.txt」だとしたら、UTF-8 エンコードでは
 UTF-8: CEB2 E78988 2E 74 78 74
になりますが、これを Shift_JIS でデコードする事はできません。

無理にデコードすると、
 Shift_JIS: CE B2 E789 88?? 2E 74 78 74
という状態になり、4文字目以降が破損します。
おそらく、"ホイ迚・txt" のように見える事でしょう。(先頭2文字は半角カナ)

これは、Shift_JIS では 88 が「2バイト文字の先導バイト」と定義されていますが、
その後には「40〜7E, 80〜FC」しか来てはならない事になっているためです。

88?? 2E の部分が、"?." となるのか、"・"になるのか、"" に潰れるのかは
処理系依存ですが、何にせよ、データ損失がある場合、逆変換は不可能です。

ただし、結果を String "ホイ迚・txt" で受け取るのではなく、
バイト配列 {CE B2 E7 89 88 2E 74 78 74} として、過不足無く受け取れるなら、
UTF-8 文字列へ復元することも可能です。ただしそれが、FtpFindFirstFile で
できるかどうかは、やってみなければ分かりませんけれども。

[ツリー表示へ]
タイトル解決しました。
記事No13452
投稿日: 2009/02/20(Fri) 13:33
投稿者王鵬
魔界の仮面弁士さん

ご指導が有難うございます。

やばり、縺ゅ≠.txtはSJISのコードです。
SJISのコードを読み出して、このコードでUTF-8に変換しました。


解決方法
@modADOS.basを作ります。


-----------------------------------------------------
下記サイトのコードを無断転載されておられるようなので
削除依頼をしましたが、ご覧になっておられないようなので
勝手ながら削除させて頂きます。 管理人

投稿されたコード
http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleModADOS.html
-----------------------------------------------------


AmodADOSの関数を使います。
dim sStr as String
sStr = ADOS_Decode_UTF8(ADOS_Encode_SJIS("縺ゅ≠.txt"))

結果は
sStr ="ああ.txt"

[ツリー表示へ]
タイトルRe: 解決しました。
記事No13453
投稿日: 2009/02/20(Fri) 13:52
投稿者魔界の仮面弁士
> ご指導が有難うございます。
日本語が…。


> やばり、縺ゅ≠.txtはSJISのコードです。
> SJISのコードを読み出して、このコードでUTF-8に変換しました。
その方法は、「ああ.txt」以外の他のファイル名でもうまくいきますか?

たとえば、No13451 に書いた、「β版.txt」などもうまくいきますか?
あるいは、「πは円周率.txt」というファイル名の時は?


> ' 著作権    : Copyright(C) 2007 のん All right reserved
> '           : このプログラムは、日本国著作権法および国際条約により保護
> '           : されています。このプログラムを転載する場合は著作権所有者
> '           : の許可が必要となります。

貴方は王鵬さんであって、のんさんでは無いですよね。
無許可転載や盗用は違法行為です。(引用との違いに注意してください)

[ツリー表示へ]
タイトルRe^2: 解決しました。
記事No13454
投稿日: 2009/02/20(Fri) 14:19
投稿者王鵬

>>たとえば、No13451 に書いた、「β版.txt」などもうまくいきますか?
>>あるいは、「πは円周率.txt」というファイル名の時は?

漢字が変換できないな、どうすれば良いですか。


>>無許可転載や盗用は違法行為です。(引用との違いに注意してください)
すみません、ルールが知らないから、
これから、注意します。

[ツリー表示へ]
タイトルRe^3: 解決しました。
記事No13455
投稿日: 2009/02/20(Fri) 21:07
投稿者花ちゃん
> >>無許可転載や盗用は違法行為です。(引用との違いに注意してください)
> すみません、ルールが知らないから、

ここの[初めにお読み下さい]をご覧下さい。
http://hanatyan.sakura.ne.jp/hazimeni.htm

> これから、注意します。

それなら、転載した部分を削除して下さい。

[ツリー表示へ]
タイトルRe^3: 解決しました。
記事No13456
投稿日: 2009/02/21(Sat) 12:20
投稿者魔界の仮面弁士
投稿者名と発言内容からして、おそらく日本の方では無いのでしょうから、
言葉遣いの問題はあまり気にしないようにしておきますが、それにしても、
以下のような点から、会話が成り立っていないような印象を受けます。

・API 部のコードの提示依頼が“無視”された点。
・強制変換を避けるべきと理由付きで解説したのに、それを“無視”して解決扱いにされた点。
・転載に許可が必要と書かれた記述を“無視”してして、無断転載を行った点。
・無断転載が違法だとしているのに、『これから、注意』するだけで、No.13452 を“放置”している点。

…管理者ではない私が述べる事ではないのでしょうけれども、せめて、無断転載の件は、
以下のいずれかの対応を取っていただけないでしょうか。

(案1) のんさんに連絡を取り、転載の許諾を得る。
(案2) どこから得た情報なのか、引用元の URL を示す。


>>>たとえば、No13451 に書いた、「β版.txt」などもうまくいきますか?
>>>あるいは、「πは円周率.txt」というファイル名の時は?
> 漢字が変換できないな、どうすれば良いですか。

「漢字が変換できない」という一文が、どのような状況を指しているのか
書かれていないので、何を知りたいのかが伝わってきません。

日本語版 Windows の操作方法(IME による漢字変換)に関する質問でしょうか。それとも、
サーバー側 OS の操作方法に関する質問でしょうか。あるいは、漢字名をつけたファイルを
FTP サーバーにアップロードした時に、ファイル名が正しく変換されないという話とか…?

何にせよ、「既に化けてしまった文字列」を強制変換するのは避けるべきです。
文字列にデコードする前の無加工バイナリの変換ならば問題ありません。


> これから、注意します。
その前に、現状の No.13452 についての対応が必須です。先のいずれかの対応を行い、
No.13452 を修正するか、あるいは、追加情報(URL の提示など)の返信投稿をお願いします。

[ツリー表示へ]