我有一个 PHP 脚本(在 Linux 服务器上运行)输出服务器上某些文件的名称。它以简单的纯文本格式输出这些文件名。
此输出是使用 HttpWebRequest、HttpWebResponse 和 StreamReader 从 VB.NET 程序中读取的。
问题是一些正在输出的文件名包含......不寻常的字符。具体来说,“节”符号(§)。
如果我在 Web 浏览器中查看 PHP 脚本的输出,则该符号看起来很好。
但是,当我将 PHP 脚本的输出读入我的 .NET 程序时,符号显示不正确(它显示为通用“块”符号)。
我已经尝试了在读取响应流(来自 HttpWebResponse)时可以使用的所有不同字符编码选项。我尝试将流直接输出到文本文件(不好),在 TextBox 中显示(不好),即使直接在 Visual Studio 调试器中查看结果,字符也会显示为块而不是“节”符号。
我已经检查了十六进制编辑器中的输出(正如相关问题所建议的那样,“你如何解决字符编码问题。”
当我从 .NET 本身写出节符号 (§) 时,我看到的表示它的十六进制字节是“c2 a7”(如果它是 unicode 就有意义,对吧?需要两个字节?)。当我将 PHP 脚本的输出直接写入文件并使用十六进制编辑器检查时,符号显示为“ef bf bd”——三个字节而不是两个?
我不知道该怎么做——如果我需要指定其他字符编码,或者我遗漏了一些明显的东西。
下面是用于获取 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、 ETC。)
- 我应该使用不同的方法来读取 PHP 脚本的输出吗?
- 输出文本时,我应该在 PHP 端做些什么不同的事情吗?
更新信息:
- PHP 的输出通过调用专门编码为 UTF-8:
utf8_encode($file);
- 当我从 .NET 中写出符号时,我从 Windows 中的 Character Map 应用程序中复制并粘贴了该符号。我还直接从文件名(在 Windows 中)和此网页本身复制并粘贴了它 - 写出时都给出了相同的十六进制值(c2 a7)。
- 是的,我说的“部分符号”是 U+00A7(Windows 上的 ALT+0167,根据字符映射表)。
- 内容类型是通过
header('Content-Type: text/html; charset=utf-8');
PHP 脚本开头的右侧显式设置的。
更新:
我自己想出来了,但如果没有回答的人的帮助,我是做不到的。谢谢!