2

我的 $_SERVER['REDIRECT_SSL_CLIENT_S_DN'] 内容包含某种十六进制数据。我该如何解码?

$_SERVER['REDIRECT_SSL_CLIENT_S_DN'] = '../CN=\x00M\x00\xC4\x00,\x00I\x00S\x00,\x004\x000\x003\x001\x002\x000\x000\x002/SN=..';
$pattern = '/CN=(.*)\\/SN=/';
preg_match($pattern, $_SERVER['REDIRECT_SSL_CLIENT_S_DN'], $server_matches);
print_r($server_matches[1]);

结果是:

\x00M\x00\xC4\x00,\x00I\x00S\x00,\x004\x000\x003\x001\x002\x000\x000\x002

我需要的结果是:

MÄ,IS,40312002

我试图用它解码它,chr(hexdec($value));它几乎可以工作,但在 html 输入中我看到很多问号。

编辑: 附加测试结果。还不完美。数组显示一些错误: http: //pastebin.com/BC4xxqmE

4

3 回答 3

1

您是否尝试过 chr() 的 unicode 等价物?chr mod 256 所有的输入,这就是你看到所有这些问号的原因。

下面的代码来自 chr php 手册中的一篇文章

function unichr($u) {
    return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}

更新

//New function
function unichr($intval) {
return mb_convert_encoding(pack('n', $intval), 'UTF-8', 'UTF-16BE');
}

我用 xC4=196 测试它给了我一个 Ä

http://codepad.viper-7.com/3htuwW

于 2013-04-18T18:56:20.590 回答
1

使用后utf8_encode,您现在有了一个多字节字符串。这意味着您需要使用 PHP 的多字节 ( mb_)函数。

所以,str_split不会再工作了。您需要使用mb_splitpreg_splitu标志一起使用。

$splitted = preg_split('//u', $string);

这是一个演示,表明您的代码现在正在运行:http: //ideone.com/nqeC0U

于 2013-04-19T13:56:03.997 回答
0

您的输入是 UTF-8,使用该转换类似于将转换为 ISO-8859-1 的 utf8_decode。UTF-8 虽然支持比 ISO-8859-1 更多的字符。这就是为什么 xC4 对您显示为问号的原因。

尝试使用更强大的东西,比如 iconv。

于 2013-04-18T18:17:26.953 回答