«
PHP中字体应用释疑

时间:2008-5-31    作者:Deri    分类: 分享


   <p>  综述:有许多朋友对网站提供繁、简两种版本感到很困惑,是怎么实现的呢?这也是时下众多PHP书籍中被漏掉的一个很重要的知识点。笔者搜集整理并根据自己的开发经验将一些重点与疑点罗列出来与大家共享!</p><p>  如何应用繁体中文转换为简体中文的PHP函数<?</p><p>  我们定义一个big5togb的函数来实现这个转换:</p><code>function big5togb($code)<br />{<br />//参数$code是big5码的字符串<br />include "data_big5.php"; //包含big5数据的文件<br />$output="";<br />$length=strlen($code); //取得字符串长度<br />$code=strtok($code,"");<br />$idx=0;<br />while ($idx < $length)<br />{<br />$tmpStr=$code[$idx].$code[$idx+1];<br />if (isbig5($tmpStr)) //判断是否big5码<br />{<br />……//如果是big5码则进行转换后输出<br />}<br />else<br />{<br />$output.= $code[$idx]; //如果不是big5码则直接输出<br />}<br />$idx++;<br />}<br />return ($output);<br />}</code></p><p>  如何应用简体中文转换为繁体中文的PHP函数?</p><p>  如何用PHP将简体中文转换为繁体中文?</p><p>  我们定义一个big5togb的函数来实现这个转换:</p><code>function gbtobig5($code)<br />{<br />include "data_gb.php"; //包含有gb码的数据文件<br />$output="";<br />$length=strlen($code);<br />$code=strtok($code,"");<br />$idx=0;<br />while ($idx < $length)<br />{<br />$tmpStr=$code[$idx].$code[$idx+1];<br />if (isgb($tmpStr)) //判断是否gb码<br />{<br />……//如果是gb码转换后输出<br />}<br />else<br />{<br />$output.= $code[$idx]; //不是gb码则直接输出<br />}<br />$idx++;<br />}<br />return ($output);<br />}</code>   在简繁体转换中怎样应用PHP输出控制功能?</p>
<p> </p>

   <p>  PHP输出控制功能是怎样一回事?</p><p>  PHP的输出信息控制函数可以让你控制你的脚本输出的内容,可以用于许多不同的情况,特别是在你的脚本已经输出信息后需要发送文件头的情况以及需要对输出信息进行编辑处理的地方。输出控制函数不对使用header()或setcookie()发送的文件头信息产生影响,只对那些类似于echo()、print() 和 PHP 代码的数据块有作用。</p><p>  例 1. 控制输出</p><p>  test.php</p><code><?<br />function test($str){<br />return str_replace("world","php",$str);<br />}<br />ob_start("test");<br />echo "hello world";<br />ob_end_flush();<br />?></code></p><p>  这个程序在没有输出信息控制的情况下应该输出为</p><p>  hello world</p><p>  但通过指定了输出控制函数后,输出变为</p><p>  hello php</p><p>  在上面的例子中,使用echo()的输出内容将会保存在输出缓冲区中,直到调用了ob_end_flush()或者脚本运行终止,然后输出信息由自定义的处理函数进行处理(替换里面的字符串)并返回结果。</p><p>  相关函数说明:</p><p>  void ob_start([string output_callback])- 打开输出缓冲区</p><p>  所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息。</p><p>  void ob_end_flush(void) - 结束(发送)输出缓冲区的内容,关闭输出缓冲区</p><p>  简繁体转换如何实现?</p><p>  简繁转换一般通过对照表的形式实现,我们这里只给出其实现代码其中:</p><code><?php<br />function gb2big5($str) {<br />global $_gb_big5_;<br />$leng = strlen($str)-1;<br />for($i = 0; $i<$leng; $i++){<br />$h = ord($str[$i]);<br />if($h>=160){<br />$l = ord($str[$i+1]);<br />$gb=($h==161 && $l==64)?" " : substr($_gb_big5_, ($h-160)*510+($l-1)*2, 2);<br />$str[$i] = $gb[0];<br />$str[$i+1] = $gb[1];<br />$i++;<br />}<br />}<br />return $str;<br />}<br />?></code><p>  $gb_big5_ 保存着big5 的字库对照表</p>
 <p> </p>

   <p>  $str 为要转化的字符串</p><p>  输出控制函数在简繁体转化中如何应用?</p><p>  目前的大多数网站的简繁体页面转换都是通过各自单独的页面实现的,这样导致在修改简体页面的时候还需要再次修改繁体的页面,不能做到自动同步。而我们提供的这个方法,可以实现同一个页面自动的变换简繁体显示。其实现方法是:</p><p>  1 建立简繁体标志,用于指示当前显示的简繁体状态,同时对简繁体状态进行切换gb_big5.php</p><code><?<br />session_start(); // 打开session 功能,用于在各个页面之间自动传递标志<br />if(!session_is_registered("big5")){ // 检查简繁体标志的注册状态<br />session_register("big5"); // 注册简繁体标志,简体=0;繁体=1<br />$ big5=0; // 默认为简体<br />}<br />$big5 = ($big5+1)%2; // 切换简繁体状态<br />header("location:".getenv("HTTP_REFERER")); // 返回其调用页面<br />?></code></p><p>  2 对页面输出信息进行控制,每个页面都调用这段程序,用于简繁体转换require.php(应包括前面第二部分的转换代码,这里略)</p><code><?<br />Session_start();<br />function translate_gb2big5($str) {<br />$str = gb2big5($str); // 转化为 big5<br />$str = str_replace('charset=gb2312', 'charset=big5', $str); // 替换字符类型<br />header('Content-Type: text/html; charset=big5'); // 繁体文件头<br />return $str;<br />}<br />if(session_is_registered("56big5") && ($big5==1)){ // 判断标志<br />$fp = fopen('big5.table', 'r'); // big5的字库表<br />$_gb_big5_ = fread($fp, filesize('big5.table')); // 读出数据<br />fclose($fp);<br />ob_start('translate_gb2big5'); // 启动输出信息控制<br />}<br />?></code></p>
 <p> </p>

   <p>  3 使用方法,这里给出一个最简单的例子,放在和 require.php 同一个目录里面test.php</p><code><?<br />require("require.php");<br />echo "你好,欢迎光临!";<br />?><br /><a href=gb_big5.php><br /><?<br />if($big5==1)echo "GB";<br />else echo "Big5";<br />?><br /></a></code></p><p>  第一次运行结果为默认简体如下</p><p>  你好,欢迎光临!</p><p>  点击 Big5 连接显示繁体如下</p><p>  你好,