我正在使用 解析 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>
我首先运行 anldap_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-8应该没问题吧?!
我还注意到以下几点: 我已经打印出这些值以查看它们是如何产生的。在 CLI 中卷曲脚本将显示正确的字符,但 Web 浏览器显示与 AD 相同。
这是怎么回事?我应该看别的东西吗,例如。网址编码? 我希望这归结为我的一个简单错误。
编辑:
我使用 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
- 广告服务器:Windows 2003
更新: 几个月后,我找不到这个问题的答案/解决方案。最后,我将字符替换为它们的非重音等价物(我知道,这并不理想)。