Я анализирую XML с помощью simplexml_load_string()
и используя данные в нем для обновления объектов Active Directory (AD) через LDAP.Иностранные символы и LDAP. Какую кодировку/кодировку ожидает 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? Я надеюсь, что это до простой ошибки на моем конце.
EDIT: Я ввел эти символы, используя графический интерфейс AD admin, чтобы посмотреть, как они выйдут. Я могу читать их через LDAP. Правильные символы отображаются в браузере. зависание через CLI покажет вопросительные знаки вместо иностранных символов. Передача одного из этих возвращенных значений в mb_detect_encoding()
вернет UTF-8.
Я решил немедленно изменить один и тот же объект, не записывая в новую строку, а просто изменяя существующее значение и сохраняя объект. Это прекрасно работает - я вижу правильное значение (обратное) в AD.
- Разработка на Mac OS X 10.7 Lion - PHP 5.4.3
- Запуск производства на: Red Hat 6 - PHP 5.4.3
- AD сервера: Windows 2003
UPDATE: Через несколько месяцев я не смог найти ответ/решение этой проблемы. В конце концов, я пошел с заменой символов на их неадресный эквивалент (НЕ идеальный, я знаю).
Используйте 'BIN2HEX()' на одном из этих значений, чтобы показать нам значения двоичной строки. – deceze
@deceze 'bin2hex (á) == c3a1'. Я не уверен, что с персонажем что-то происходит, поскольку оно копируется и наклеивается повсюду. Системный буфер обмена может испортить/изменить его (?). – OmidTahouri
Я предполагаю, что LDAP/AD, являющийся версией LDAP для Microsoft, находится в кодировке WINDOWS-1250 как что-либо от Microsoft ... Поэтому 'iconv (« UTF-8 »,« WINDOWS-1250 », $ str); должно сработать. – shadyyx