分享
 
 
 

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

王朝php·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

Borland开发讨论区 微软开发讨论区 C/C++讨论区 新手入门专区

作者:紫竹,y10k

概要:本文对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 的朋友能从中得到启发,做出更好的作品。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有