如:(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]).";" ;
}

解决方案 »

  1.   

    function html_entity_encode($str) {
      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);
    }
      

  2.   

    $text="&#20013;&#22269;&#20154;";
    $len = substr_count($text,'&#')*2;
    $text = mb_convert_encoding($text, "GBK", "HTML-ENTITIES");
    //$len =  mb_strlen($text);
    echo pack("a{$len}",$text);
    注:本例$len可以用两个任意都可以,如果是自己不熟悉的编码,建议用后面一个
      

  3.   


    我印象中,pack是按照一定模式转换内容,如果是中英文混排的话,貌似是没有办法做到很好的区分开中英文!另外“&#20013;&#22269;&#20154;”这种格式的编码是unicode双字节编码,我不知道pack怎么将gb2312的编码转换成“&#20013;&#22269;&#20154;”,能实际写出代码吗?
      

  4.   


    不知道你已经发出来了,可是貌似直接下面就可以,原来不知道mb_convert_encoding可以直接转换HTML-ENTITIES的echo mb_convert_encoding('我是中国人', "HTML-ENTITIES", "GBK");
      

  5.   


    谢谢回复,不过答案貌似不对呀。 要求是 中文 --->>> &#xxxxx 的转换。
      

  6.   

    ……可能我习惯了写文件操作,都pack处理一下,按二进制输出呵呵,交流下好,你不说我还没留意这个
      

  7.   

    呃,正在写dom,有点晕,请看#6