ldap_explode_dn的奇怪编码结果

问题描述 投票:0回答:1

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中使用它?

php encoding ldap
1个回答
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 );
}
© www.soinside.com 2019 - 2024. All rights reserved.