Я анализирую XML с помощью simplexml_load_string()
и использую содержащиеся в нем данные для обновления объектов Active Directory (AD) через LDAP.
Пример XML (упрощенный):
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>Bìlbö Bággįnš</user>
<user>Gãńdåłf Thê Gręât</user>
<user>Śām Wīšë</user>
</users>
Сначала я запускаю ldap_search()
, чтобы найти одного пользователя, а затем приступаю к изменению его атрибутов. Закачка вышеуказанных значений прямо в AD с использованием LDAP приведет к появлению некоторых довольно искаженных символов.
Например: Bìlbö BággįnÅ¡
Я пробовал следующие функции, но безрезультатно:
utf8_encode($str);
utf8_decode($str);
iconv("UTF-8", "ISO-8859-1//TRANSLIT", $str);
iconv("UTF-8", "ASCII//TRANSLIT", $str);
iconv("UTF-8", "T.61", $str);
В идеале я не хочу делать ни одну из этих строк преобразования. UTF-8 должно быть в порядке, верно?!
Еще я заметил следующее: Я распечатал значения, чтобы увидеть, как они выходят. скручивание скрипта в CLI покажет правильные символы, но веб-браузеры показывают то же самое, что и AD.
Что происходит? Должен ли я смотреть на что-то еще, например. Кодировка URL? Я надеюсь, что это до простой ошибки с моей стороны.
РЕДАКТИРОВАТЬ:
Я ввел эти символы с помощью графического интерфейса администратора AD, чтобы посмотреть, как они выйдут. Я могу читать их через LDAP в порядке. В браузере отображаются правильные символы. закручивание через CLI будет отображать вопросительные знаки вместо иностранных символов. Передача одного из этих возвращаемых значений в mb_detect_encoding()
вернет кодировку UTF-8.
Я решил немедленно изменить тот же объект, не записывая новую строку, а просто изменив существующее значение на противоположное и сохранив объект. Это отлично работает - я вижу правильное значение (обратное) в AD.
ОБНОВЛЕНИЕ: Через несколько месяцев я не смог найти ответ/решение этой проблемы. В конце концов, я пошел с заменой символов на их эквиваленты без акцента (не идеально, я знаю).