<?php
/**
* 把一個(gè)漢字轉(zhuǎn)為unicode的通用函數(shù),不依賴任何庫(kù),和別的自定義函數(shù),但有條件
* 條件:本文件以及函數(shù)的輸入?yún)?shù)應(yīng)該用utf-8編碼,不然要加函數(shù)轉(zhuǎn)換
* 其實(shí)亦可輕易編寫反向轉(zhuǎn)換的函數(shù),甚至不局限于漢字,奇怪為什么PHP沒(méi)有現(xiàn)成函數(shù)
* @author xieye
*
* @param {string} $word 必須是一個(gè)漢字,或代表漢字的一個(gè)數(shù)組(用str_split切割過(guò))
* @return {string} 一個(gè)十進(jìn)制unicode碼,如4f60,代表漢字 “你”
*
* @example
echo "你 ".getUnicodeFromOneUTF8("你");
echo "<br />";
echo "好 ".getUnicodeFromOneUTF8("好");
echo "<br />";
echo "你好 ".getUnicodeFromOneUTF8("你好");
echo "<br />";
echo "你好嗎 ".getUnicodeFromOneUTF8("你好嗎");
你 20320
好 22909
你好 251503099357000
你好嗎 4.21952182258E+21
*/
function getUnicodeFromOneUTF8($word) {
//獲取其字符的內(nèi)部數(shù)組表示,所以本文件應(yīng)用utf-8編碼!
if (is_array( $word))
$arr = $word;
else
$arr = str_split($word);
//此時(shí),$arr應(yīng)類似array(228, 189, 160)
//定義一個(gè)空字符串存儲(chǔ)
$bin_str = '';
//轉(zhuǎn)成數(shù)字再轉(zhuǎn)成二進(jìn)制字符串,最后聯(lián)合起來(lái)。
foreach ($arr as $value)
$bin_str .= decbin(ord($value));
//此時(shí),$bin_str應(yīng)類似111001001011110110100000,如果是漢字"你"
//正則截取
$bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/','$1$2$3', $bin_str);
//此時(shí), $bin_str應(yīng)類似0100111101100000,如果是漢字"你"
return bindec($bin_str);
//返回類似20320, 漢字"你"
//return dechex(bindec($bin_str));
//如想返回十六進(jìn)制4f60,用這句
}
echo "你 ".getUnicodeFromOneUTF8("你");
echo "<br />";
echo "好 ".getUnicodeFromOneUTF8("好");
echo "<br />";
echo "你好 ".getUnicodeFromOneUTF8("你好");
echo "<br />";
echo "你好嗎 ".getUnicodeFromOneUTF8("你好嗎");
exit;
?>
方法一
<?php
//漢字轉(zhuǎn)換為16進(jìn)制編碼
function hexEncode($s) {
return preg_replace('/(.)/es',"str_pad(dechex(ord('\\1')),2,'0',STR_PAD_LEFT)",$s);
}
//16進(jìn)制編碼轉(zhuǎn)換為漢字
function hexDecode($s) {
return preg_replace('/(\w{2})/e',"chr(hexdec('\\1'))",$s);
}
echo hexDecode(hexEncode("北京歡迎您!"));
?>
——————————————————————————————————————————
方法二
echo rawurlencode("北京歡迎您").'<br>';
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù)。
解碼用:rawurldecode
——————————————————————————————————————————
方法三及原理
GBK版:
GBK編碼中一個(gè)漢字由二個(gè)字符組成,
通過(guò)ord()函數(shù)獲取字符的ASCII值如果大于127時(shí),就可以確定當(dāng)前字符為一個(gè)漢字的前半部分,還需要獲取漢字的后半部分。當(dāng)然,這種判斷的方法要結(jié)合具體的開(kāi)發(fā)環(huán)境,如果存在ASCII值大于127的單個(gè)字符,這種方法判斷顯然就不正確。
PHP實(shí)現(xiàn)中文字符轉(zhuǎn)十進(jìn)制的原理就是通過(guò)for循環(huán)的方法獲取一個(gè)漢字的二個(gè)字符,然后使用ord()函數(shù)把各字符轉(zhuǎn)換為十進(jìn)制。如上分別是:不 [178 187] 要 [210 170] 迷 [195 212] 戀 [193 181] 哥 [184 231]
PHP 實(shí)現(xiàn)中文字符轉(zhuǎn)十六進(jìn)制的原理就是首先使用ord()函數(shù)取出各個(gè)中文字符的十進(jìn)制,具體可查看[PHP函數(shù)篇掌握ord()與chr()函數(shù)應(yīng)用],然后使用dechex()函數(shù)把各個(gè)中文字符轉(zhuǎn)化為十六進(jìn)制
$string = "北京歡迎您!";
$length = strlen($string);
echo $string;
$result = array();
//十進(jìn)制
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
echo '<br>';
//十六進(jìn)制
$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = dechex($dec[0])." ".dechex($dec[1]);
}
var_dump($strings);
UTF-8版:
$string = "北京歡迎您!";
$length = strlen($string);
echo $string;
$result = array();
//十進(jìn)制
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
echo '<br>';
//十六進(jìn)制
$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = dechex($dec[0])." ".dechex($dec[1])." ".dechex($dec[2]);
}
var_dump($strings);
聯(lián)系客服