GB_2312 字符集是目前最常用的汉字编码标准。在这个标准中,每个汉字用2个字节来表示,每个字节的ascii码为 161-254 (16 进制A1 - FE),第一个字节 对应于 区码的1-94 区,第二个字节 对应于位码的1-94 位。
汉字的unicode 编码范围为 \u4e00 ~ \u94a5
<?php
header("charset=utf-8");
$str = "Mn一丁丂七丄丅丆万丈丌啊";
echo $base = base64_encode($str);
echo "<br/>";
echo base64_decode($base);
echo "<hr/>";
$code = encode64($str);
echo $code,"<br/>";
echo $decode = decode64($code);
function encode64($str){
$base64 = implode("",range('A','Z')).implode("",range('a','z')).implode("",range('0','9'))."+/";
if($str=="") return false;
$binStr = StrToBin($str);
$more = 0;
$encodeStr = "";
for($i=0;$i<strlen($binStr);$i+=6){
if($more == 4) $more = 0;
$more++;
$bin6 = substr($binStr,$i,6);
if(strlen($bin6)<6){
$bin6 .= str_repeat("0",6 - strlen($bin6));
}
$index = base_convert($bin6, 2, 10);
$encodeStr .= $base64{$index};
}
return $encodeStr.str_repeat("=",4 - $more);
}
function decode64($str){
$base64 = implode("",range('A','Z')).implode("",range('a','z')).implode("",range('0','9'))."+/";
if($str=="") return false;
$more = substr_count($str, "=");
$str = substr($str,0,strlen($str)-$more);
$arr = str_split($str);
$binStr = "";
//base64 到 6个二进制还原
foreach($arr as $val){
$index = strpos($base64,$val);
$bin6 = base_convert($index, 10, 2);
$binStr .= str_repeat("0",6-strlen($bin6)).$bin6;
}
//6 => 8 二进制还原
$binStr = substr($binStr,0,strlen($binStr)-$more*2);
return BinToStr($binStr);
}
function StrToBin($str){
$arr = preg_split("/(?<!^)(?!$)/u",$str);
$binStr = "";
foreach($arr as $v){
$hex = unpack("H*",$v);
$bin8 = base_convert($hex[1], 16, 2);
$mod = 8 - fmod(strlen($bin8),8);
if($mod > 0 && $mod < 8)
$bin8 = str_repeat("0",$mod).$bin8;
$binStr .= $bin8;
}
return $binStr;
}
function BinToStr($str){
$binArr = array();$index=0;$index2=0;
for($i=0;$i<strlen($str);$i+=8){
$bin8 = substr($str,$i,8);
if($bin8{0}==0){
$bin8 = preg_replace("/^0+/", " ", $bin8);
$binArr[$index] = $bin8;
$index++;
}else{
if($index2==0){
$binArr[$index] = " ".$bin8;
$index2++;
}else{
$binArr[$index] .= $bin8;
$index2++;
if($index2==3){
$index2=0;
$index++;
}
}
}
}
$deArr = array();
foreach($binArr as $k=>$v){
$hex = base_convert($v, 2, 16);
$v = pack("H".strlen($hex),$hex);
$deArr[$k] = $v;
}
return join("",$deArr);
}