<?php
/*
* 功能: 字符Unicode编码转换
* 参数一: 要转码的字符串
* 参数二: 是否转码ASCII字符 默认不转码
*
*/
function unicode_encode($string, $isAll = false){
$string = iconv('UTF-8', 'UCS-2', $string); // 将字符编码转换为 UCS-2
$strLen = strlen($string) - 1; // 获取字符长度
$retStr = '';
for ($i = 0; $i < $strLen; $i = $i + 2){
$codeA = ord($string[$i]); // 取出第一位 字节
$codeB = $string[$i+1]; // 取出第二位字符
// 如果第一位字节大于0则表示是扩展字符(汉字) 否则为 ASCII字符
if($codeA > 0){
$retStr.= '&#' . ($codeA * 256 + ord($codeB)) . ';';
}else{
// 判断ASCII字符是否转码
$retStr.= $isAll ? '&#' . ord($codeB) . ';' : $codeB;
}
}
return $retStr;
}
/*
* 功能: Unicode编码转换字符
* 参数一: 要转码的字符串
* 参数二: 是否转码ASCII字符 默认不转码
*
*/
function unicode_decode($string){
$pregStr = '/&#([0-9]+);/';
// 进行匹配并在出错时返回
if(preg_match_all($pregStr, $string, $codeList, PREG_OFFSET_CAPTURE) === false) return false;
$retStr = '';
$repOffset = 0;
foreach ($codeList['1'] as $key => $value){
// 大于255 则说明是2位字节 (汉字)
$code = intval($value['0']); // 转换为整数
// 如果大于255 则说明有两个字节
$codeB = $code % 256; // 取第二个字节的内容
if($code > 255){
$codeA = ($code - $codeB) / 256; // 计算出第一个字节
$newStr = chr($codeA) . chr($codeB); // 拼接成一个字符
$newStr = iconv('UCS-2', 'UTF-8', $newStr); // 将字符编码转换为 UCS-2
}else{
$newStr = chr($codeB); // 拼接成一个字符
}
// 替换掉原来的内容
$repLen = strlen($codeList['0'][$key]['0']);
$repStart = $codeList['0'][$key]['1'];
$string = substr_replace($string, $newStr, $repStart - $repOffset, $repLen);
$repOffset+= $repLen - strlen($newStr);
}
return $string;
}
$str = '锄禾日当午,HanDi禾下土;举头望明月,12345...';
// 进行编码
$enStr = unicode_encode($str, true);
echo $enStr . "\n";
// 进行解码
$deStr = unicode_decode($enStr);
echo $deStr . "\n";
?>