【发布时间】:2012-06-14 14:32:56
【问题描述】:
我正在解析 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-8应该没问题吧?!
我还注意到以下几点: 我已经打印出这些值,看看它们是如何产生的。在 CLI 中卷曲脚本将显示正确的字符,但 Web 浏览器显示与 AD 相同。
发生了什么事?我应该看别的东西吗,例如。网址编码? 我希望这归结为我的一个简单错误。
编辑:
我使用 AD admin 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
更新: 几个月后,我找不到这个问题的答案/解决方案。 最后,我将字符替换为非重音字符(我知道这不太理想)。
【问题讨论】:
-
在其中一个值上使用
bin2hex()向我们展示二进制字符串值。 -
@deceze
bin2hex( á ) == c3a1。我不确定这个角色是否会发生任何事情,因为它被复制并粘贴到各处。系统剪贴板可能会损坏/更改它(?)。 -
我猜 LDAP/AD 是 Microsoft 版本的 LDAP 是在
WINDOWS-1250编码,就像来自 Microsoft 的任何东西一样......因此iconv("UTF-8", "WINDOWS-1250", $str);应该可以工作。 -
它不喜欢 WINDOWS-1250 -
iconv(): Detected an illegal character in input string -
与php文件本身没有UTF8编码有什么关系吗?访问ldap的php文件应该将其编码类型设置为UTF-8?
标签: php encoding active-directory ldap