ldap_explode_dn的奇怪编码结果

时间:2018-02-22 13:38:08

标签: php encoding ldap

使用ldap_explode_dn转换DN字符串后,某些字符(在我的情况下是西里尔字母)会转换为我无法识别的其他编码。

例如ldap_explode_dn('cn=tt,ou=groups,o=ц1,ou=realms,dc=uvf,dc=local', 0);返回

Array
(
    [0] => tt
    [1] => groups
    [2] => \D1\861
    [3] => realms
    [4] => uvf
    [5] => local
)

如您所见,ц字符已转换为\D1\86。我想这是两字节的UTF-8,但是我无法理解它是如何解码它的。

我尝试了许多方法,例如iconvmb_convert_encoding,但没有成功。

我的问题是 - 这种编码是什么以及如何在PHP中使用它?

1 个答案:

答案 0 :(得分:1)

我发现this user note on php.net为您的问题提供了解决方案。

修改 从PHP 5.5起,对于preg_replace不推荐使用修饰符 e ,所以这里是一个基于链接用户注释的preg_replace_callback解决方案:

function myldap_explode_dn( $dn, $with_attrib ) {
    $result = ldap_explode_dn( $dn, $with_attrib );

    //translate hex code into ascii again
    foreach ( $result as $key => $value ) {
        $result[ $key ] = preg_replace_callback(
            "/\\\([0-9A-Fa-f]{2})/",
            function ( $matches) {
                return chr( hexdec( $matches[1] ) );
            },
            $value
        );
    }

    return ( $result );
}