UTF-8 проблемы с PHP DOM на сервере Debian
У меня проблема со строками UTF-8 в PHP на моем сервере Debian.
Обновление в деталях
Я провел немного больше испытаний, и теперь ситуация более конкретная. Я обновил название и детали, чтобы лучше соответствовать ситуации. Спасибо за ответы и извините, что проблема не была четко описана. Следующий скрипт отлично работает на моей локальной машине с Windows, но не на моем сервере Debian:
<?php
header("Content-Type: text/html; charset=UTF-8");
$string = '<html><head></head><body>UTF-8: ÄÖÜ<br /></body</html>';
$document = new DOMDocument();
@$document->loadHTML($string);
echo $document->saveHTML();
echo $string;
Как и ожидалось, на моей локальной машине вывод:
UTF-8: ÄÖÜ
UTF-8: ÄÖÜ
На моем сервере вывод:
UTF-8: ÄÖÜ
UTF-8: ÄÖÜ
Я написал скрипт в Notepad++ в UTF-8 без спецификации и перенес его через SSH. Как заметил Гвидо, сама строка должным образом закодирована в кодировке UTF-8. Кажется, есть проблема с PHP DOM или, возможно, libxml. И причина должна быть в некоторой настройке, поскольку она зависит от машины.
Оригинальный вопрос
Я работаю локально с XAMPP на Windows, и все в порядке. Но когда я развернул свой проект на сервере, строки UTF-8 запутались. На самом деле, когда я загружаю этот тестовый скрипт
echo utf8_encode('UTF-8 test: ÄÖÜ');
Я получаю "ÃÃÃ". Также, когда я подключаюсь к серверу с помощью putty, я не могу правильно написать умляуты (ÄÖÜ) в оболочке. Я понятия не имею, связана ли эта проблема даже с PHP.
6 ответов
Причиной проблемы была старая версия libxml (2.6.32.) На сервере. На разработке машина была 2.7.3. Я обновил libxml до нестабильного пакета, в результате чего появилась версия 2.7.8. Проблемы теперь ушли.
Проверьте свой апач AddDefaultCharset
установка.
В стандартных дистрибутивах Debian Apache этот параметр можно изменить в /etc/apache2/conf.d/charset
,
РЕДАКТИРОВАТЬ: ответ на обновленный вопрос:
PHP заголовок ("Content-Type: text / html; charset = UTF-8"); $ string = ''. ''. ' head>UTF-8: ÄÖÜ
body html>'; $document = new DOMDocument(); @$ Document->loadHTML($ строка); echo $document->saveHTML(); echo $string;?>
Я подозреваю, что ваша входная строка может быть уже UTF-8. Пытаться:
setlocale (LC_CTYPE, 'de_DE.UTF-8'); $ s = "UTF-8 test: ÄÖÜ"; if (mb_detect_encoding ($ s, "UTF-8") == "UTF-8") { echo "Нет необходимости кодировать"; } еще { $s = utf8_encode($s); echo "Закодированная строка $s"; }
Пожалуйста, убедитесь, что ваш файл побайтный, такой же, как на вашем локальном компьютере. Передача FTP в текстовом режиме могла испортить это. Вы можете попробовать двоичный.
Вы явно отправляете заголовок типа контента? Если вы его опустите, вполне вероятно, что Apache отправит вам его. Если файл обслуживается кодировкой Latin-1 (Apache) и браузер считывает его как таковой, то ваши символы UTF-8 будут искажены.
Попробуй это:
<?php
echo "Drop some UTF-8 characters here.";
Тогда это:
<?php
header("Content-Type: text/html; charset=UTF-8");
echo "Drop some UTF-8 characters here.";
Второе должно работать, если первое не работает. Вы также можете сохранить файл как файл в кодировке UTF-8, если это еще не сделано.
Если символы вашей базы данных испорчены, попробуйте установить кодировку (My)SQL-соединения.
Попробуйте изменить кодировку defualt на сервере в файле php.ini:
default_charset = "UTF-8"
также убедитесь, что вы отправляете правильные заголовки типа контента как utf-8
По моему опыту с utf-8, если вы правильно сконфигурируете модуль php mbstring и используете функции mbstring, а также убедитесь, что ваше соединение с базой данных использует utf-8, то у вас не возникнет никаких проблем.
Часть db может быть выполнена для mysql с помощью запроса "SET NAMES 'utf8'"
Я обычно запускал выходной буфер, используя mbstring для обработки буфера. Это то, что я использую на производственных сайтах, и это очень солидный подход. Затем отправьте буфер, когда закончите рендеринг вашего контента.
Дайте мне знать, если вам нужен код sampe для этого.
Еще один простой способ узнать, отправляются ли php или веб-серверу неправильные заголовки, - это использовать меню view->encoding в вашем браузере и посмотреть, является ли это utf-8. Если это не так, и вы переключаете его на utf-8, и все выглядит хорошо, то это проблема с вашими заголовками или типом контента. Если это уже utf-8, а текст испорчен, значит, что-то идет не так в вашем коде или подключении к БД. Если вы используете mysql, убедитесь, что используемые таблицы и столбцы также являются utf-8