转贴一篇文章,不知对楼主有没有用。举个简单的例子:  
gb.inc.php  
$title="简体";  
big5.inc.php  
$title="繁体";  
 
调用的时候,根据语言分别包含上面2个文件,即若为简体则包含gb.inc.php、若为繁体则包含big5.inc.php  
===  
End  
---------------------------------------------------------------  
 
PHP输出控制功能在简繁体转换中的应用    
   
 概要:本文对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  的朋友能从中得到启发,做出更好的作品。

解决方案 »

  1.   

    分段用pack转换,但你给出的不是gb2312编码串
      

  2.   

    用 xuzuning说的方法可以把4d6220207765616a71bac5c2eb转换过来,
    但不知道unpack这个函数怎么用,我再用的时候老是出问题,请高手给个例子看看:)
      

  3.   

    <?php
    $s = "b0a1b0a2b0a3b0a4b0a5";
    for($i=0;$i<strlen($s);$i+=4)
      echo pack("H4",substr($s,$i,4));
    ?>
      

  4.   

    to:xuzuning
    function decode($str){
    $format="H".strlen($str);
    return pack($format,$str);
    }
    就可以了,
    $s = "b0a1b0a2b0a3b0a4b0a5";
    decode($s)的结果是:啊阿埃挨哎
    我还想知道unpack() 函数
    他的功能是:解压缩位元字串资料
    我想知道能不能用unpack函数把”啊阿埃挨哎“变成“b0a1b0a2b0a3b0a4b0a5”
    我试了一下都得不到结果,能给个例子吗
      

  5.   

    1、echo bin2hex("啊");2、print_r(unpack("H4","啊");3、$c = unpack("H4","啊");
    echo $c[0];
      

  6.   

    unpack的使用方法和pack是一样的
      

  7.   

    3、$c = unpack("H4","啊");
    echo $c[0];
    echo $c[0];是空的,我就是此不理解?
      

  8.   

    print_r(unpack("H4","啊");
    输出Array ( [] => b0a1 ) $c = unpack("H4","啊");
    echo $c[0];
    输出空的
    ????????
      

  9.   

    php版本问题吧?
    这样没问题:
    list(,$c) = each(unpack("H4","啊"));
    echo $c;