サーバー上のいくつかのファイルの名前を出力する PHP スクリプト (Linux サーバー上で実行) があります。これらのファイル名を単純なテキストのみの形式で出力します。
この出力は、HttpWebRequest、HttpWebResponse、および StreamReader を使用して VB.NET プログラムから読み取られます。
問題は、出力されるファイル名の一部に... 異常な文字が含まれていることです。具体的には、「セクション」記号 (§) です。
PHP スクリプトの出力を Web ブラウザーで表示すると、シンボルは正常に表示されます。
しかし、PHP スクリプトの出力を .NET プログラムに読み込むと、シンボルが正しく表示されません (一般的な「ブロック」シンボルとして表示されます)。
応答ストリームを (HttpWebResponse から) 読み取るときに使用できるさまざまな文字エンコード オプションをすべて試しました。ストリームをテキスト ファイルに直接出力し (ダメ)、TextBox に表示しようとしましたが (ダメ)、結果を Visual Studio デバッガーで直接表示しても、文字がブロックとして表示されます。 「セクション」記号。
16 進数エディターで出力を調べました (関連する質問「文字エンコーディングの問題をどのようにトラブルシューティングしますか? 」で示唆されているように) 。
セクション シンボル (§) を .NET 自体から書き出すと、それを表す 16 進バイトは "c2 a7" になります (Unicode の場合は意味がありますよね? 2 バイトが必要ですか?)。PHP スクリプトからの出力を直接ファイルに書き出し、それを 16 進エディタで調べると、シンボルが「ef bf bd」と表示されます。2 バイトではなく 3 バイトですか?
他の文字エンコーディングを指定する必要がある場合、またはこれについて明らかな何かが欠けている場合、どうすればよいか途方に暮れています。
PHP スクリプトの出力を取得するために使用されるコードは次のとおりです (VB スタイルのコメントは、このサイトで正しく表示されるように変更されています)。
Dim myRequest As HttpWebRequest = WebRequest.Create("http://www.example.com/sample.php")
Dim myResponse As HttpWebResponse = myRequest.GetResponse()
// read the response stream
Dim myReader As New StreamReader(myResponse.GetResponseStream())
// read the entire output in one block (just as an example)
Dim theOutput as String = myReader.ReadToEnd()
何か案は?
- 間違った種類の StreamReader を使用していますか? (新しい StreamReader を作成する呼び出しで文字エンコーディングを渡そうとしました - System.Text.Encoding にあるすべてのものを試しました - UTF-8、UTF-7、ASCII、UTF-32、Unicode、等。)
- PHP スクリプトの出力を読み取るために別の方法を使用する必要がありますか?
- テキストを出力するときに、PHP 側で別のことをする必要がありますか?
更新情報:
- PHP からの出力は、次のように呼び出して UTF-8 でエンコードされます。
utf8_encode($file);
- .NET からシンボルを書き出したとき、Windows の Character Map アプリからシンボルをコピーして貼り付けました。また、ファイル名 (Windows の場合) とこの Web ページ自体から直接コピーして貼り付けました。書き出すと、すべて同じ 16 進数の値になりました (c2 a7)。
- はい、私が話している「セクション シンボル」は U+00A7 (Windows では ALT+0167、Character Map によると) です。
- content-type は
header('Content-Type: text/html; charset=utf-8');
、PHP スクリプトの先頭で明示的に設定されます。
アップデート:
自分で考え出しましたが、回答者の助けがなければできませんでした。ありがとうございました!