PHP输出控制功能在简繁体转换中的应用

  一PHP输出控制功能介绍
  PHP作为当今流行的脚本语言之一,具有编写简便,执行速度快,扩充性好等优点。PHP的输出信息控制函数可以让你控制你的脚本输出的内容,可以用于许多不同的情况,特别是在你的脚本已经输出信息后需要发送文件头的情况以及需要对输出信息进行编辑处理的地方。输出控制函数不对使用header()或setcookie()发送的文件头信息产生影响,只对那些类似于echo()、print()和PHP代码的数据块有作用。
  例1.控制输出
  test.php
  <?
  function test($str){
  return str_replace("php2000","y10k",$str);
  }
  ob_start("test");
  echo"hello php2000";
  ob_end_flush();
  ?>
  这个程序在没有输出信息控制的情况下应该输出为
  hello php2000
  但通过指定了输出控制函数后,输出变为
  hello y10k
  在上面的例子中,使用echo()的输出内容将会保存在输出缓冲区中,直到调用了ob_end_flush()或者脚本运行终止,然后输出信息由自定义的处理函数进行处理(替换里面的字符串)并返回结果。
  相关函数说明
  ob_start([string output_callback])-打开输出缓冲区
  所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息。
  ob_end_flush-结束(发送)输出缓冲区的内容,关闭输出缓冲区
  二简繁体转换的实现
  一般通过对照表的形式实现,相关的文章非常多,这里就不多讲了,只给出其实现代码
  <?
  function gb2big5($str){
  global$_gb_big5_;
  $leng=strlen($str)-1;
  for($i=0;$i<$leng;$i++){
  $h=ord($str[$i]);
  if($h>=160){
  $l=ord($str[$i+1]);
  $gb=($h==161&&$l==64)?"":substr($_gb_big5_,($h-160)*510+($l-1)*2,2);
  $str[$i]=$gb[0];
  $str[$i+1]=$gb[1];
  $i++;
  }
  }
  return$str;
  }
  ?>
  其中:
  $gb_big5_保存着big5的字库对照表
  $str为要转化的字符串
  三输出控制函数在简繁体转化中的应用
  目前的大多数网站的简繁体页面转换都是通过各自单独的页面实现的,这样导致在修改简体页面的时候还需要再次修改繁体的页面,不能做到自动同步。而我们提供的这个方法,可以实现同一个页面自动的变换简繁体显示。其实现方法是:
  1建立简繁体标志,用于指示当前显示的简繁体状态,同时对简繁体状态进行切换
  php2000_gb_big5.php
  <?
  session_start();//打开session功能,用于在各个页面之间自动传递标志
  if(!session_is_registered("php2000_big5")){//检查简繁体标志的注册状态
  session_register("php2000_big5");//注册简繁体标志,简体=0;繁体=1
  $php2000_big5=0;//默认为简体
  }
  $php2000_big5=($php2000_big5+1)%2;//切换简繁体状态
  header("location:".getenv("HTTP_REFERER"));//返回其调用页面
  ?>
  2对页面输出信息进行控制,每个页面都调用这段程序,用于简繁体转换
  require.php(应包括前面第二部分的转换代码,这里略)
  <?
  Session_start();
  function translate_gb2big5($str){
  $str=gb2big5($str);//转化为big5
  $str=str_replace('charset=gb2312','charset=big5',$str);//替换字符类型
  header('Content-Type:text/html;charset=big5');//繁体文件头
  return$str;
  }
  if(session_is_registered("php2000_big5")&&($php2000_big5==1)){//判断标志
  $fp=fopen('big5.table','r');//big5的字库表
  $_gb_big5_=fread($fp,filesize('big5.table'));//读出数据
  fclose($fp);
  ob_start('translate_gb2big5');//启动输出信息控制
  }
  ?>
  3使用方法,这里给出一个最简单的例子,放在和require.php同一个目录里面
  test.php
  <?
  require("require.php");
  echo"大家好,这里是PHP世纪网";
  ?>
  <a href=php2000_gb_big5.php>
  <?
  if($php2000_big5==1)echo"GB";
  else echo"Big5";
  ?>
  </a>
  第一次运行结果为默认简体如下
  大家好,这里是PHP世纪网Big5
  点击Big5连接显示繁体如下
  大家好,這里是PHP世紀網GB
  点击GB将返回简体页面
  由于使用了session保存了简繁体标志,这样其他任何使用了require.php的页面都会自动按照当前的标志显示相应的页面。更多的实例请看我的网站http://www.php2000.com。
  4 big5字库的保存的改进方法
  曾经考虑使用session来保存big5字库,但使用后发现速度明显减慢,主要因为session也是通过文件形式实现,所以不会对性能产生提高,而且因为session不会根据简繁体标志自动判断装载与否,所以造成在简体下也装载了big5的字库,所以造成速度减慢。
  由于我用的服务器为linux所以考虑使用共享内存(Windows不支持共享内存)来保存big5字库信息。其更改的代码为require.php的判断部分:
  <?
  if(session_is_registered("php2000_big5")&&($php2000_big5==1))
  {
  //修改成使用共享内存
  //判断是否已经创建,打开50000字节的0xff3段的共享内存
  $shm_id= shmop_open(0xff3,"a",0644,50000);
  if($shm_id){
  $_gb_big5_=shmop_read($shm_id,0,shmop_size($shm_id));//读出big5数据
  }
  else{
  //创建50000字节的系统标识为0xff3的共享内存块
  $shm_id= shmop_open(0xff3,"c",0644,50000);
  //读出数据
  $fp=fopen('big5.table','r');
  $_gb_big5_=fread($fp,filesize('big5.table'));
  fclose($fp);
  if($shm_id){
  $shm_bytes_written=shmop_write($shm_id,$_gb_big5_,0);//写入big5数据
  }
  }
  ob_start('translate_gb2big5');
  }
  ?>
  关于共享内存的使用方法,请参看有关资料。
  四结论
  PHP作为一种公开源代码的脚本语言,其扩充性是非常好的。本文只是对其一个功能的一种应用方式的探讨,并实现了比较完美的同一页面自动简繁体转换功能。希望广大爱好PHP的朋友能从中得到启发,做出更好的作品。