У меня есть скрипт PHP (работающий на сервере Linux), который выводит имена некоторых файлов на сервере. Эти имена файлов выводятся в простом текстовом формате.
Этот вывод считывается из программы VB.NET с использованием HttpWebRequest, HttpWebResponse и StreamReader.
Проблема в том, что некоторые имена выводимых файлов содержат ... необычные символы. В частности, символ «раздел» (§).
Если я просматриваю вывод сценария 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, и др.)
- Должен ли я использовать другой метод для чтения выходных данных сценария PHP?
- Что-то, что я должен делать по-другому на стороне PHP при выводе текста?
ОБНОВЛЕННАЯ ИНФОРМАЦИЯ:
- Вывод из PHP специально кодируется UTF-8 путем вызова:
utf8_encode($file);
- Когда я выписал символ из .NET, я скопировал и вставил символ из приложения Character Map в Windows. Я также скопировал и вставил его непосредственно из имени файла (в Windows) и с самой этой веб-страницы - все выдали одинаковое шестнадцатеричное значение при записи (c2 a7).
- Да, "символ раздела", о котором я говорю, это U + 00A7 (ALT + 0167 в Windows, в соответствии с картой символов).
- Тип содержимого задается явно через
header('Content-Type: text/html; charset=utf-8');
в самом начале PHP-скрипта.
UPDATE:
Сам понял, но я не смог бы сделать это без помощи людей, которые ответили. Спасибо!