2011-01-10 34 views
2

我写了一个小PHP脚本将字符串转换为十六进制 但我有一个问题,或者我错过了什么,这里是一个小测试:PHP BIN2HEX问题

$char='だ'; 
$a='a'; 
echo $char,':', bin2hex($char),"\n"; 
echo $a,':', bin2hex($a),"\n"; 

结果我得到的“a” (或任何ASCII)是正确的,但对中国或希伯来语和阿拉伯语 不正确这里是输出:

だ:e381a0 
a:61 

这是什么长号码此CHAR(だ)从字符表工具HEX是3060 但为什么我从PHP获得错误的值。

谢谢。

+0

仅供参考,这是日文字符 – ajreal 2011-01-10 12:01:51

回答

2

0xE381A0的UTF-8编码:

U+3060 だ e3 81 a0 HIRAGANA LETTER DA 

http://www.utf8-chartable.de/unicode-utf8-table.pl?start=12192

所以,如果你输入应该你的输出是正确的成为UTF-8。

更新

如果这是你想要的东西,你可以用任何一种获得3060

iconv_set_encoding('internal_encoding', 'UTF-8'); 

echo bin2hex(iconv('UTF-8', 'ISO-10646-UCS-2', 'だ')) . PHP_EOL; 
echo bin2hex(iconv('UTF-8', 'UNICODE-1-1', 'だ')) . PHP_EOL; 
echo bin2hex(iconv('UTF-8', 'UTF-16BE', 'だ')) . PHP_EOL; 

进一步的信息请参见iconv()

0
  • E3 = 227
  • 81 = 129
  • A0 = 160

这可能是一个3字节的Unicode字符,因此这三个十六进制值由bin2hex()返回。看到这个phpsh输出,如果你还在困惑:

php> =bin2hex('adam') 
"6164616d" 
+0

但是,我如何得到正确的十六进制值,charmap工具返回了3060这个字符,我需要一种方法从PHP获得相同的值。而且我也和阿拉伯语一样。 – ibmkhd 2011-01-10 12:01:00

+0

我不认为有一个“正确的十六进制值”。您可以将这三个十六进制数字相加,但e381a0与a081e3是不同的字符,并且它们的总和相同。除非你说`0xE3 + 0x81 * 16 + 0xA0 * 16 * 16`。您是否试图让PHP为您提供与charmap相同的价值? – 2011-01-10 12:05:00