使用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,但是我无法理解它是如何解码它的。
我尝试了许多方法,例如iconv
和mb_convert_encoding
,但没有成功。
我的问题是 - 这种编码是什么以及如何在PHP中使用它?
答案 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 );
}