我有$ _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
答案 0 :(得分: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测试它给了我一个Ä
答案 1 :(得分:1)
使用utf8_encode
后,您现在拥有一个多字节字符串。这意味着您需要使用PHP的multibyte (mb_
)函数。
因此,str_split
将不再有效。您需要将mb_split
或preg_split
与u
标记一起使用。
$splitted = preg_split('//u', $string);
这是一个演示,表明您的代码现在正在运行:http://ideone.com/nqeC0U
答案 2 :(得分:0)
您的输入是UTF-8,使用该转换类似于utf8_decode,它将转换为ISO-8859-1。 UTF-8虽然支持比ISO-8859-1更多的字符。这就是为什么xC4会显示为你的问号。
尝试使用像iconv这样功能更强大的东西。