Сбой PHP SimpleXML_load_string с использованием немецких символов (umlaute)

#php #xml #character-encoding #simplexml

#php #xml #кодировка символов #simplexml

Вопрос:

У меня возникают проблемы с синтаксическим анализом строки xml с помощью simplexm_load_string. Черт возьми, я не могу понять, где я ошибся в этом скрипте.

 <?php 
header('Content-Type: text/html; charset=utf-8');
$string = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<document>
    <title>ÄÖÜ</title>
</document>
XML;

$xml = simplexml_load_string($string);

print_r($xml);
?>
 

Комментарии:

1. Что произойдет, если вы используете simplexml_load_string(utf8_encode($string)); тот же результат?

2. Это сделало свое дело! Большое вам спасибо!

3. @Martin: это должно было быть только для анализа. Теперь, когда вы знаете, что это работает, просто удалите это ut8_encode снова и сохраните файл в кодировке UTF-8. Тогда вы действительно закончили.

Ответ №1:

Черт возьми, я не могу понять, где я ошибся в этом скрипте.

Поскольку вы не сохраняете файл PHP как UTF-8, вы не можете использовать строку в нем:

 $string = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<document>
    <title>ÄÖÜ</title>
</document>
XML;
 

в кодировке UTF-8. Сохраните файл как UTF-8, и он работает.

Если вы не уверены, вы также можете поступить по-другому:

 <?php 
header('Content-Type: text/html; charset=utf-8');
$string = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<document>
    <title>xC3x84xC3x96xC3x9C</title>
</document>
XML;

$xml = simplexml_load_string($string);

print_r($xml);
 

Это делается путем указания двоичных байтов из расширенной панели в двоичной нотации PHP, чтобы они были защищены от разных кодировок в этой части октетов. Это было бы довольно надежно.

Но подумайте о сохранении ваших PHP-файлов в кодировке UTF-8. Обычно это лучшая практика в веб-разработке.

Демонстрация: https://eval.in/private/76c12983305e81

Комментарии:

1. Спасибо вам обоим за вашу помощь — оба способа сработали, но вы указали мне правильное направление — по-видимому, Notepad был настроен мной неправильно.

2. Будьте осторожны при сохранении как UTF-8: НИКОГДА с BOM. Обычный UTF-8, без спецификации. Я знаю, что Notepad (как и любой хороший текстовый редактор) может делать и то, и другое, поэтому вам нужно быть осторожным здесь.

3. тогда все хорошо. только что была неделя, эти спецификации могут стать довольно трудными для обнаружения.

Ответ №2:

Попробуйте использовать:

 simplexml_load_string(utf8_encode($string))
 

Комментарии:

1. Скорее всего, файл имеет кодировку не Latin-1, а Win-1252. таким образом, этот ответ, хотя он может быть хорошим предположением и поначалу кажется, что он работает, может просто оказаться неправильным. Это также не объясняет причину проблемы и не объясняет, как ее исправить уже с самим файлом.

2. @hakre конечно, конечно, это правда, без сомнения, вы правы.