PHP & 技术 04 Jan 2005 11:16 am

GB2UFT8

看到好多人还在用4、5年前的GB - UTF8转换程序,真的很难过。就算不用ICOVN函数,也可以进步一点吧,

上传的文件包含gb2312全集,每行:
1到2字节,GB2312码
3字节,空格
4字节,对应utf8码的位数;
后面,utf8码+回车(rn);

附件: gb2utf8.txt

http://www.phpx.com/happy/showthread.php?s=&threadid=90509&perpage=15&pagenumber=1

  1. //对照表的使用(一)
  2.  
  3. $filename = "gb2utf8.txt.new";
  4.  
  5. $fp = fopen($filename,"r");
  6.  
  7. while(! feof($fp)) {
  8.  
  9.   list($gb,$utf8) = fgetcsv($fp,10);
  10.  
  11.   $charset[$gb] = $utf8;
  12.  
  13. }
  14.  
  15. fclose($fp);
  16.  
  17. //以上读取对照表到数组备用
  18.  
  19.  
  20.  
  21. function gb2utf8($text) {
  22.  
  23.   global $charset;
  24.  
  25.   //提取文本中的成分,汉字为一个元素,连续的非汉字为一个元素
  26.  
  27.   preg_match_all("/(?:[x80-xff].)|[x01-x7f]+/",$text,$tmp);
  28.  
  29.   $tmp = $tmp[0];
  30.  
  31.   //分离出汉字
  32.  
  33.   $ar = array_intersect($tmp, array_keys($charset));
  34.  
  35.   //替换汉字编码
  36.  
  37.   foreach($ar as $k=>$v)
  38.  
  39.     $tmp[$k] = $charset[$v];
  40.  
  41.   //返回换码后的串
  42.  
  43.   return join('',$tmp);
  44.  
  45. }
  46.  
  47.  
  48.  
  49. echo gb2utf8("haha,这是对照表的测试");
  50.  
  51. ?>
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58. //对照表的使用(二)
  59.  
  60. //建立表gb2utf8,二个字段:gb、utf8。把对照表导入到表中(代码略)
  61.  
  62. function gbk2utf8($text) {
  63.  
  64.     /* 提取文本中的汉字 */
  65.  
  66.     preg_match_all("/[x80-xff]./",$text,$ar);
  67.  
  68.     $expr = join("','", array_unique($ar[0]));
  69.  
  70.     /* 检索文本中所使用的汉字 */
  71.  
  72.     mysql_connect();
  73.  
  74.     mysql_select_db('test');
  75.  
  76.     $rs = mysql_query("select * from gb2utf8 where gb in ('$expr')");
  77.  
  78.     while(list($key, $value) = mysql_fetch_row($rs))
  79.  
  80.         $gb[$key] = $value;
  81.  
  82.  
  83.  
  84.     /* 分解文本的各个成分 */
  85.  
  86.     preg_match_all("/(?:[x80-xff].)|[x01-x7f]+/",$text,$ar);
  87.  
  88.     $ar = $ar[0];
  89.  
  90.  
  91.  
  92.     /* 替换汉字编码 */
  93.  
  94.     foreach($ar as $k=>$v)
  95.  
  96.         if(array_key_exists($v,$gb))
  97.  
  98.             $ar[$k] = $gb[$v];
  99.  
  100.     return join(' ',$ar);
  101.  
  102. }
  103.  
  104. ?>

有人问及逆转换:utf82gb
假定读照表已读到数组charset,则

原贴

http://www.phpx.com/happy/showthread.php?s=&threadid=90509&perpage=15&pagenumber=2

  1. function utf82gb($text, &$charset) {
  2.  
  3.   $p = "/[xf0-xf7][x80-xbf]{3}|[xe0-xef][x80-xbf]{2}|[xc2-xdf][x80-xbf]|[x01-x7f]+/";
  4.  
  5.   preg_match_all($p,$text,$r);
  6.  
  7.   $utf8 = array_flip($charset);
  8.  
  9.   foreach($r[0] as $k=>$v)
  10.  
  11.     if(isset($utf8[$v]))
  12.  
  13.       $r[0][$k] = $utf8[$v];
  14.  
  15.   return join('',$r[0]);
  16.  
  17. }
  18.  
  19.  
  20.  
  21. $s = gb2utf8('这是对照表的测试');
  22.  
  23. echo utf82gb($s,$charset);

Trackback This Post | Subscribe to the comments through RSS Feed

Leave a Reply