■59813 / inTopicNo.5) |
Re[3]: uriにutf8文字列をセットする方法 |
□投稿者/ 魔界の仮面弁士 (2202回)-(2011/06/07(Tue) 19:40:45)
|
■No59796 (jj さん) に返信
> する方法を知る必要がある、と考えているのです。
受信側については、FtpWebResponse.GetResponseStream の読み取り時に Encoding を
指定するだけで済みますが、送信 URL については、Encoding の指定方法が提供されていません。
先の私の回答にて、FtpWebRequest が Uri をデコードする際の仕組みを記述しています。
サーバー側が [OPTS utf8 on] コマンドをサポートしているかどうかを調べてみてください。
その上で、サーバー側が OPTS utf8 on に対応できないようであれば、FtpWebRequest を
使う事は諦めて、SocketクラスやTcpClientクラスで対処した方が良いと思います。
http://members.jcom.home.ne.jp/1213687801/tookun.html
> つまり、この「バイトの配列」を「そのままのバイト列とした」String型
その方向では解決できないと思いますよ。
ANSI (CP932) で "テスト.txt" という文字列にデコード可能な文字列を格納しようにも、
ほぼ間違いなく、文字化けという名のデータ破損を引き起こすことが予想されます。
先にも書きましたが、文字列自体にエンコーディング情報を埋め込めるわけではありません。
FtpWebRequest が送出するコマンドは UTF-8 もしくは ANSI(CP932) だろうと予想していますが、
System.String の内部バイナリは UTF-16 固定であり、CP932 で格納できるようにはなっていません。
たとえば、"テスト.txt" を UTF-8 でエンコードすると、
テ : E3 83 86
ス : E3 82 B9
ト : E3 83 88
. : 2E
t : 74
x : 78
t : 74
となりますよね。
上記バイナリを CP932 でデコードするとなると、結果は
繝 : E3 83
: 86
: E3
せ : 82 B9
繝 : E3 83
: 88
: 2E
t : 74
x : 78
t : 74
となります。
ということは、"せ繝" という文字列(5B 30 5D 7E)を渡せば、それが CP932 として
デコードされる場合、先の UTF-8 バイナリの一部に相当する 82 B9 E3 83 が送出されるわけです。
しかしこの方法では、その前後にある 86 E3 や 88 2E に相当する文字列は作れません。
86,E3 や 86 というバイナリは、CP932 では有効な文字データとして処理されないため、
これらのバイナリを無理に String 化させても、結局は破損する
(復元不可能な文字化けを引き起こす)ことになります。
ゆえに、そうしたバイナリに相当する Uri を作りこむことはできないかと。
Dim a1 As String = Chr(&H86E3)
Dim b1 As String = Chr(&H882E)
Dim c1 As String = Chr(&H86)
Dim a2 As String = System.Text.Encoding.Default.GetString(New Byte() {&H86, &HE3})
Dim b2 As String = System.Text.Encoding.Default.GetString(New Byte() {&H88, &H2E})
Dim c2 As String = System.Text.Encoding.Default.GetString(New Byte() {&H86})
仮に、そうした Uri を作りこめたと仮定しても、その文字列の内容が UTF-8 として
送出されるのか、それとも ANSI (CP932) で送出されるのかは、先の OPTS utf8 on への
応答結果によって変わってしまうわけですから、あまり良い方法では無いでしょう。
|
|