2011-01-10 37 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