<?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";

?>


评论(0条)

刀客源码 游客评论