2012-01-23 76 views
0

我有一个中国的字符集与字符编码为UTF-8的变量:PHP诅咒

$a='列'; 

由此,我怎样才能得到“5217”分配给一个字符串值($b )(可能使用UTF-16?但可能有更好的方法来做到这一点)?

代码: http://www.fileformat.info/info/unicode/char/5217/index.htm

+0

我知道你通常会使用'ORD()'得到一个字符的ASCII码,但在这种情况下,我不知道它是否会起作用。 –

+0

如果是ascii,我会说'尝试'ord()',但显然这不起作用。 –

+0

我能以某种方式将UTF-8转换为ASCII吗? – David19801

回答

0
function unicode_decode($str) { 
    return preg_replace_callback("/((?:[^\x09\x0A\x0D\x20-\x7E]{3})+)/", "decode_callback", $str); 
} 

function decode_callback($matches) { 
    $char = mb_convert_encoding($matches[1], "UTF-16", "UTF-8"); 
    $escaped = ""; 
    for ($i = 0, $l = strlen($char); $i < $l; $i += 2) { 
     $escaped .= "\u" . sprintf("%02x%02x", ord($char[$i]), ord($char[$i+1])); 
    } 
    return $escaped; 
} 

$a='列'; 
var_dump(unicode_decode($a)); 
+0

作品!需要删除$上的“\ u”部分以获得所需的输出......这是如何工作的......我不知道...... – David19801

+0

-1输入'''失败(' '\ xf0 \ xa4 \ xad \ xa2'')通过返回''\ xa2''(原文!不是数字),并且是不必要的。 – phihag

0

你可以简单地解析UTF-8:

function utf8ord($c) { 
    $ord0 = ord($c{0}); 
    if ($ord0 < 0x80) return $ord0; 
    if ($ord0 < 0xe0) return ($ord0 & 0x1f) << 6 | (ord($c{1}) & 0x3f); 
    if ($ord0 < 0xf0) return ($ord0 & 0x0f) << 12 | (ord($c{1}) & 0x3f) << 6 | (ord($c{2}) & 0x3f); 
    return ($ord0 & 0x07) << 18 | (ord($c{1}) & 0x3f) << 12 | (ord($c{2}) & 0x3f) << 6 | (ord($c{3}) & 0x3f); 
} 

$a = '列'; 
$b = dechex(utf8ord($a)); 
var_export($b); // outputs '5217' 
+0

'utf8ord'在哪里? – xdazz

+0

@xdazz糟糕,在那里有一个错字。固定。 – phihag