Php ldap_explode_dn结果的奇怪编码
使用Php ldap_explode_dn结果的奇怪编码,php,encoding,ldap,Php,Encoding,Ldap,使用ldap\u explode\u DN转换DN字符串后,一些字符(在我的例子中是西里尔字母)被转换为我无法识别的其他编码 例如ldap\u explode\u 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
ldap\u explode\u DN
转换DN字符串后,一些字符(在我的例子中是西里尔字母)被转换为我无法识别的其他编码
例如ldap\u explode\u 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\u convert\u编码
,但都没有成功
我的问题是-这种编码是什么,以及如何在PHP中使用它?我发现它为您的问题提供了解决方案
编辑:
自PHP 5.5以来,preg_replace不推荐使用修饰符e,因此下面是一个基于链接用户注释的preg_replace_回调解决方案:
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 );
}
谢谢你的回答,我看到了这个解决方案,但我认为这是一个解决办法。我将等待一天的其他答案,如果没有更好的解决方案,我会接受你的答案(我怀疑实际上是否有)。