Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Функции PHP перестали работать после перевода текста файла в UTF-8 / 15 сообщений из 15, страница 1 из 1
14.01.2015, 17:13
    #38854486
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Добрый день!

Запустил свой сайт на валидацию и выяснилось, что я нарушитель стандарта HTML5. Я оказывается должен код HTML писать в UTF-8. Полазил по интернету, терпеливо все PHP-файлы преобразовал в формат "UTF-8 (без BOM). Исправил все косяки, которые вылезли после перевода. Но одну проблему никак не могу решить

Есть такой файл report.php:
Код: php
1.
2.
3.
4.
5.
<?php
$strDoc = file_get_contents('report.xml');
header('Content-type: application/msword;');
echo $strDoc;
?>



Он всегда замечательно работал, пока PHP-был в формате ANSI. После перекодировки report.php в формат UTF-8 (без BOM), документ Word (который получается на выходе), не открывается. При попытке открыть сгенерированный файл появляется следующая надпись "Не удается открыть XML-файл report.php-1 из-за проблем с его содержимым... Сведения: Объявление text/xml может находиться только в самом начале входных данных. Error location: Line:2, Column: 55".

Кто-нибудь сталкивался? Как это победить?
...
Рейтинг: 0 / 0
14.01.2015, 18:51
    #38854572
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей Смирнов,

а что в report.xml ?
...
Рейтинг: 0 / 0
14.01.2015, 19:13
    #38854589
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей СмирновЕсть такой файл report.php:
Код: php
1.
2.
3.
4.
5.
<?php
$strDoc = file_get_contents('report.xml');
header('Content-type: application/msword;');
echo $strDoc;
?>




Он всегда замечательно работал, пока PHP-был в формате ANSI.Сколько ни вглядывался, не увидел в этом коде ни одного символа национального алфавита. Соответственно, нормальная перекодировка никаким образом не должна повлиять на этот файл.
...
Рейтинг: 0 / 0
14.01.2015, 19:16
    #38854591
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей СмирновКак это победить?Для начала есть смысл пристально посмотреть на отдаваемые заголовки и контент. Возможно, даже какой-нибудь HEX-смотрелкой. Мож где затесался BOM или лишний перевод строки.
...
Рейтинг: 0 / 0
14.01.2015, 20:02
    #38854616
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
r uАлексей Смирнов,
а что в report.xml ?

report.xml я создаю из программы Microsoft Word 2003 с помощью команды "Сохранить как", выбираю расширение "xml". Этот файл загружаю в PHP строкой $strDoc = file_get_contents('report.xml');
Потом с помощью функции str_replace делаю поиск-замену некоторых участков текста (говоря простым языком в вордовский шаблон вставляю данные из базы данных).

На выходе с помощью строк:
header('Content-type: application/msword;');
echo $strDoc;

Получаю готовый вордовский документ. Все счастливы...были до тех пор, пока я не узнал, что мой исходный код не угодил разработчикам стандарта html5. А мне не хочется возвращаться к стандарту HTML4, иначе буду комплексовать на тему использования старых стандартов в своих проектах.
...
Рейтинг: 0 / 0
14.01.2015, 20:05
    #38854618
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
vkleСколько ни вглядывался, не увидел в этом коде ни одного символа национального алфавита. Соответственно, нормальная перекодировка никаким образом не должна повлиять на этот файл.Сам поражаюсь. Здесь в UTF-8 перекодирован только сам файл report.php, который не содержит ни строчки HTML-кода. После этого одна из 3-х приведенных мной строк стала везти себя неадекватно. Я предполагаю, что функция echo. Возможно, что она в такой ситуации выдает браузеру что-то другое. Пробовал делать преобразования в ту и в другую сторону с помощью iconv и на выходе и на входе и по всякому. Пробовал добавлять в Header кодировку utf-8. Ничего не помогает.
...
Рейтинг: 0 / 0
14.01.2015, 20:13
    #38854621
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
vkleАлексей СмирновКак это победить?Для начала есть смысл пристально посмотреть на отдаваемые заголовки и контент. Возможно, даже какой-нибудь HEX-смотрелкой. Мож где затесался BOM или лишний перевод строки.
Я просмотрел первые примерно 100 символов по-байтно с помощью функции ord(). Лишних символов не обнаружил. Переводы строки /r/t пробовал заменить на /r. Меняются, но результат тот же. Дальше уже копаться не стал, т.к. всё равно во внутренней структуре XML, сгенерированном вордом разобраться проблематично.

Сейчас пришла идея попробовать не перекодировать сами php-файлы в UTF-8, просто научить функцию echo выдавать на выходе HTML-код в формате UTF-8. А базу данных, шаблон HTML и исходные коды проекта оставить в кодировке Windows-1251. Иначе переделывать базу данных и весь исходный код проекта просто проблематично. Кроме того пишут, что стандартные строковые функции PHP с кодировкой UTF-8 работать не будут и их все надо менять на другие функции. Уже не рад что связался, но другого пути нет. Стандарт HTML5 требует UTF-8.
...
Рейтинг: 0 / 0
14.01.2015, 20:22
    #38854626
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей СмирновНичего не помогает.Мало поможет, пока не уточните, что именно получается на выходе. Пока время и желание позволяет, можете смело действовать методом тыка или безосновательных предположений. Как вариант, восстановите из бекапа "живой" файл. Или перепишите все три строчки ручками с нуля (не используя копипаст). Хотя, можете потратить пару минут на сбор объективных данных, при помощи которых локализовать и устранить ошибку.


Алексей Смирновперекодирован только сам файл report.php, который не содержит ни строчки HTML-кода. После этого одна из 3-х приведенных мной строк стала везти себя неадекватно.Сам отдаваемый 'report.xml' теоретически мог измениться в это же время.
...
Рейтинг: 0 / 0
14.01.2015, 20:24
    #38854627
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей СмирновПереводы строки /r/t пробовал заменить на /rОпечатка? Стандартный перевод /r/n, а не /r/t.
...
Рейтинг: 0 / 0
14.01.2015, 20:27
    #38854630
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей Смирновнаучить функцию echo выдавать на выходе HTML-код в формате UTF-8
1. echo - это не функция (см. мануал), а конструкция языка.
2. про кодировку она понятия не имеет, что ей передали для вывода - то и отдаст как есть, включая бинарные данные.
...
Рейтинг: 0 / 0
14.01.2015, 21:01
    #38854642
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
vkleКак вариант, восстановите из бекапа "живой" файл. Или перепишите все три строчки ручками с нуля (не используя копипаст). Хотя, можете потратить пару минут на сбор объективных данных, при помощи которых локализовать и устранить ошибкуЯ согласен. Оставим этот вариант на крайний случай).
vkleОпечатка? Стандартный перевод /r/n, а не /r/t.Ну да опечатка.
vkle echo - это не функция (см. мануал), а конструкция языкаМануал как раз до этого за несколько минут смотрел. В русскоязычном переводе её называют функцией и по синтаксису параметры можно писать в круглых скобках, при этом уточняется, что т.к. это конструкция языка, то можно написать и без скобок.

В общем, я написал функцию:
Код: php
1.
2.
3.
4.
5.
// ФУНКЦИЯ: выводит текст в кодировке UTF-8
function echou($strText) {
	// вывод преобразованного текста
	echo iconv("WINDOWS-1251", "UTF-8",$strText);
}


Заменил echo на echou() у себя на главной странице, ещё указал в заголовке HTML: <META http-equiv="content-type" content="text/html; charset=utf-8" />
При этом все файлы проекта и данные базы оставил в родной кодировке ANSI "Windows-1251".

Прогнал через валидатор. Больше на utf-8 не ругается). Фокус удался в принципе. Не знаю к каким это приведет последствиям, дальше видно будет).
...
Рейтинг: 0 / 0
14.01.2015, 22:17
    #38854668
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
Алексей СмирновФокус удался в принципе. Не знаю к каким это приведет последствиям, дальше видно будет).Кстати, довольно распространённый фокус, нормально работает. Если файл xml будет периодически экспортироваться "из ворда" - это правильное решение, не потребуется его с той же периодичностью перекодировать вручную или отдельным скриптом. С другой стороны, если на одно обновление файла приходится тысяча его скачиваний, так не вижу смысла перекодировать его каждый раз на лету - достаточно и одного раза при сохранении. Продолжая тему излишеств, не вижу смысла и в использовании этого трёхстрочного скрипта (если, конечно, в нём нет чего-то ещё, чего мы не видим) - можно настроить вебсервер для отдачи требуемого Content-Type.

О последствиях :-)
Если же этот файл представляет часть проекта - ситуация прямо противоположная. Когда разные файлы сохранены в разной кодировке, последствия могут быть вызваны невнимательностью при использовании текстового редактора. Не все редакторы автоматически определяют кодировку. В некоторых случаях при правке где-то в начале файла, где глазами не видно кириллицы (она дальше, в конце), можно забыть указать в редакторе используемую кодировку. В таком случае после сохранения есть шансы получить полную невосстановимую потерю кириллического текста (помогает только восстановление из бекапа). Случается такое не часто, конечно, но, увы, когда-то сам нарывался, когда-то коллеги...



Алексей Смирнов echo - это не функция (см. мануал), а конструкция языкаМануал как раз до этого за несколько минут смотрел. В русскоязычном переводе её называют функцией и по синтаксису параметры можно писать в круглых скобках,А Вы попробуйте написать в круглых скобках два или более параметра :-) И, да, где это в русскоязычной документации http://php.net/manual/ru/function.echo.php её функцией обозвали?
...
Рейтинг: 0 / 0
15.01.2015, 15:42
    #38855354
AndronovMV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
vkle,

))) Просто ты походу модератор http://php.net/manual/ru/function.echo.php ))))
...
Рейтинг: 0 / 0
17.01.2015, 14:37
    #38856730
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
vkleКстати, довольно распространённый фокус, нормально работает.Спасибо, это радует!)

Проект весь мой, поэтому проблем с разными кодировками не будет.

Вообще теперь сделал так, что весь HTML собирается в одну переменную, а на выходе всего-лишь один echo:
Код: php
1.
echo iconv("WINDOWS-1251", "UTF-8", $strHTML);


Хорошо, пусть echo будет конструкцией, я не против).
...
Рейтинг: 0 / 0
17.01.2015, 14:41
    #38856737
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции PHP перестали работать после перевода текста файла в UTF-8
vkleЕсли файл xml будет периодически экспортироваться "из ворда" - это правильное решение, не потребуется его с той же периодичностью перекодировать вручную или отдельным скриптом. С другой стороны, если на одно обновление файла приходится тысяча его скачиваний, так не вижу смысла перекодировать его каждый раз на лету - достаточно и одного раза при сохранении.В случае хранения файлов проекта *.php в кодировке ANSI проблема с XML отпадает сама собой, т.к. в этом случае документ на выходе получается нормальным. Даже ничего переделывать не пришлось. А XML из Word экспортируется в UTF-8 автоматически (я проверял в редакторе XML, там кодировка UTF-8 сразу стоит).
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Функции PHP перестали работать после перевода текста файла в UTF-8 / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]