2

サーバー上のいくつかのファイルの名前を出力する 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 スクリプトの先頭で明示的に設定されます。

アップデート:

自分で考え出しましたが、回答者の助けがなければできませんでした。ありがとうございました!

4

4 に答える 4

1

PHP では、エンコーディングをまったく制御できますか? 一般的に、ただ推測するのは得策ではありません。

.NET からシンボルを書き出したと言うとき、どのエンコーディングを使用していましたか? 実際の Unicode コード ポイントは何ですか? ユニコード U+00A7にセクション記号があります - それはあなたが意味するものですか? PHPがそれを「ef bf bd」と表現する理由はわかりません。

StreamReader を使用しても問題ありませんが、正しいエンコーディングを知る必要があります。

編集:さて、それはUTF-8であることを意図しており、確かにそうではありません-したがって、問題はPHP側にあります. 実行utf8_encode($file)して結果のバイトを明示的に (Web サーバーが邪魔することなく) 出力するとどうなりますか? ブラウザが正しいシンボルを取得できることに本当に驚いています...これは単なるHTMLですか?「ef bf bd」のすべてが単なるセクション記号であると確信していますか?

この Web サーバーはどこかで公開されていますか? ブラウザでその場所にアクセスできれば、何が起こっているのかわかるかもしれません

于 2008-12-15T16:06:34.603 に答える
1

を使用していますutf8_encode($file)が、PHP はコンテンツ タイプも UTF-8 として返しますか? Content-TypePHP ページから返されたヘッダーを確認できますか? 特にcharsetフィールドを見て、次のようなものがあることを確認する必要があります。

Content-Type: text/html; charset=utf-8

.NET が (正しいか間違っているかに関わらず) 失敗しているときに、ブラウザーがどのように文字を正しく表示できるかがわかります。ブラウザーは通常、可能な限り堅牢で寛容になろうとします。使用しているブラウザは、文字シーケンスから実際の文字エンコーディングを推測している可能性があります。

于 2008-12-15T16:34:55.407 に答える
0

上記のアドバイスを使用して、次の内容を含むファイルを作成する簡単なソリューションを作成しました。

$feed = header("Content-Type: text/html; charset=utf-8");
$feed.=utf8_encode(readfile(rawurldecode($_GET["url"])));
$feed = fread(rawurldecode($_GET["url"]));
die($feed);

これは PHP ですが、他の言語に簡単に移植できます。次に、UTF8 の問題を引き起こしている使用したい URL を呼び出すだけです (RSS フィードに問題があることがわかったため、RSS フィードが必要です) 。http://example. com/fix-my-rss.php?url=http://anotherexample.com/broken.rss

これはファイルに読み込まれ、別のファイルとして返されます。問題なく、スクリーンリーダーなどに読み込むことができます。同様に、文字列または問題のコードが含まれているものを読み取るように変更できます。

于 2012-02-06T15:10:56.773 に答える