外国人物和LDAP。 什么编码/字符集不LDAP期待?(Foreign characters a

2019-07-29 22:52发布

我解析XML,与simplexml_load_string()并使用其中的数据来更新活动目录(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 应该没事吧?!

我也注意到以下几点:我已经打印出来的值,看看他们是怎么出来的。 卷曲-ING在CLI脚本会显示正确的字符,但Web浏览器显示等同于广告。

这是怎么回事? 我应该看别的东西,比如。 URL编码? 我希望这是下降到在我结束一个简单的错误。

编辑:我在使用AD管理GUI,看看他们将如何走出这些字符输入。 我可以通过LDAP精细阅读。 正确的字符在浏览器中显示的时候。 卷曲-ING通过CLI将显示问号而非外国字符。 传递这些返回的值的一成mb_detect_encoding()将返回UTF-8。

我决定立即在一个新的字符串不写,只是扭转现有的值,并保存对象修改同一个对象。 这工作得很好 - 我看到在AD正确的值(逆转)。

  • 发展中国家在Mac OS X 10.7狮子 - PHP 5.4.3
  • 正在运行的生产上:红帽6 - PHP 5.4.3
  • AD服务器:Windows 2003中

UPDATE:几个月后,我无法找到答案/解决这个问题。 最后,我用字符替换其非重音的等价去(不理想,我知道)。

Answer 1:

您是否使用LDAP V3?

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

LDAPv3的默认情况下,它预计请求和响应默认情况下是在支持UTF-8。 看这里: http://technet.microsoft.com/en-us/library/cc961766.aspx



Answer 2:

这是解决方案,为我工作。 做以下的事情:

1)首先,请确保您使用LDAP协议版本3,使用“UTF-8”在默认情况下:

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

2)如果要更改用户密码,比确保“使用TLS”选项设置为true ,并使用SSL false

ldap_start_tls($ldapConnection);

3.)我使用的端口号389

4)使用PHP函数ldap_mod_replace更换用户的密码。

5)使用下面的函数来编码您的$password

public function encodePassword($password)
{
    $password="\"".$password."\"";
    $encoded="";
    for ($i=0; $i <strlen($password); $i++){ 
        $encoded.="{$password{$i}}\000"; 
    }
    return $encoded;
}

6)使用下面的逻辑来改变用户的密码:

$password="test";
if(mb_detect_encoding($password) == 'UTF-8')
{
    $password = utf8_decode($password);
}

$add=array();
$add["unicodePwd"][0] = encodePassword($password);

$result = @ldap_mod_replace($ldapConnection, $userDn, $add);
if ($result === false){
    //your action
}
else{
    //Your action
}

7)请注意,功能encodePassword将编码您的$password为UTF-8编码。 如果您的密码是UTF-8编码,那么你必须把它发送到之前将其解码encodePassword功能。 这就是为什么我写的一行:

if(mb_detect_encoding($password) == 'UTF-8')
{
    $password = utf8_decode($password);
}

此代码工作对我来说,当我在密码提供德语变音: äüößÄÜ等..



Answer 3:

我已经成功地与两步加入LDAP外文字符:

  • 只能用ASCII字符添加用户(的iconv “ASCII // TRANSLIT”)

  • 使用ldapmodify来更新字段(一个或多个)使用UTF-8字符

LDAPv3的是UTF-8,但我用的工具(从smbldap-tools )并没有与它妥善处理。



Answer 4:

另一件事更何况那些跨越这个绊脚石:

如果您的文本已经是UTF-8,那么不要尝试重新编码。 注意在文档页面上的以下言论函数utf8_encode 。 重新编码的已编码字符串将导致乱码。 此外,该函数仅允许一个特定的编码到另一个。

如果你做类似的东西需要UTF-8编码字符串,你可以很方便地测试:

if (!preg_match('//u', $value)) {
    // do your encoding process...
}

关于字符显示不正确或者在网页上,但他们都在CLI,请确保您设置在标题中的正确的字符集:

header('Content-type: text/html; charset=utf-8');



文章来源: Foreign characters and LDAP. What encoding/charset does LDAP expect?