我正在解析 XML,simplexml_load_string()
,并使用其中的数据通过 LDAP 更新 Active Directory (AD) 对象。
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()
找到单个用户,然后继续更改其属性。使用 LDAP 将上述值直接输入 AD,将导致显示一些非常混乱的字符。
例如: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-8should没事吧?!
我还注意到以下几点:我已经打印了这些值,看看它们是如何产生的。在 CLI 中卷曲脚本将显示正确的字符,但 Web 浏览器显示与 AD 相同的字符。
这是怎么回事?我应该看别的东西吗,例如。网址编码?我希望这只是我的一个简单错误。
EDIT:我使用 AD 管理 GUI 输入这些字符,看看它们会如何显示。我可以通过 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:几个月后,我无法找到这个问题的答案/解决方案。
最后,我将字符替换为非重音的等效字符(我知道这并不理想)。