如:(gb2312)“中国人”的(unicode十进制)是:“中国人”
php里 echo "中国人";浏览器能自动输出:“中国人”,无论编码是gbk,utf-8,iso-xxxx,或其他编码,甚至写错了的编码。所以我想把部分中文字符转换成浏览器能自动识别的兼容性能强的uncode字符。手册翻了老半天,没找到直接转换的函数,所以自己写了个转换过程,看上去挺别扭的,上来问问有没有更好的解决方法。我的代码是:$str = iconv("gb2312", "utf-8", "abc中国人123");
echo preg_replace_callback("/\\\u([a-f0-9]{4})/","tmp",substr(json_encode($str),1,-1)) ;
function tmp($match){
return $match[1] = "&#".hexdec($match[1]).";" ;
}
php里 echo "中国人";浏览器能自动输出:“中国人”,无论编码是gbk,utf-8,iso-xxxx,或其他编码,甚至写错了的编码。所以我想把部分中文字符转换成浏览器能自动识别的兼容性能强的uncode字符。手册翻了老半天,没找到直接转换的函数,所以自己写了个转换过程,看上去挺别扭的,上来问问有没有更好的解决方法。我的代码是:$str = iconv("gb2312", "utf-8", "abc中国人123");
echo preg_replace_callback("/\\\u([a-f0-9]{4})/","tmp",substr(json_encode($str),1,-1)) ;
function tmp($match){
return $match[1] = "&#".hexdec($match[1]).";" ;
}
preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(ord($v[0]) < 128) {
$ar[$k] = htmlentities($v);
} else {
$v = iconv("GBK","UCS-2",$v);
$ar[$k] = "&#".((ord($v[0]) << 8) + ord($v[1])).';';
}
}
return join("",$ar);
}
$len = substr_count($text,'&#')*2;
$text = mb_convert_encoding($text, "GBK", "HTML-ENTITIES");
//$len = mb_strlen($text);
echo pack("a{$len}",$text);
注:本例$len可以用两个任意都可以,如果是自己不熟悉的编码,建议用后面一个
我印象中,pack是按照一定模式转换内容,如果是中英文混排的话,貌似是没有办法做到很好的区分开中英文!另外“中国人”这种格式的编码是unicode双字节编码,我不知道pack怎么将gb2312的编码转换成“中国人”,能实际写出代码吗?
不知道你已经发出来了,可是貌似直接下面就可以,原来不知道mb_convert_encoding可以直接转换HTML-ENTITIES的echo mb_convert_encoding('我是中国人', "HTML-ENTITIES", "GBK");
谢谢回复,不过答案貌似不对呀。 要求是 中文 --->>> &#xxxxx 的转换。