明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PHP輸出控制技巧在簡(jiǎn)繁體轉(zhuǎn)換中的應(yīng)用

[摘要]PHP輸出控制功能在簡(jiǎn)繁體轉(zhuǎn)換中的應(yīng)用概要:本文對(duì)PHP的輸出控制功能進(jìn)行了簡(jiǎn)單介紹并對(duì)其在簡(jiǎn)繁體轉(zhuǎn)化中的應(yīng)用給出了具體思路和實(shí)例 一 PHP 輸出控制功能介紹 PHP作為當(dāng)今流行的腳本語(yǔ)言之一,具有編寫簡(jiǎn)便,執(zhí)行速度快,擴(kuò)充性好等優(yōu)點(diǎn)。PHP的輸出信息控制函數(shù)可以讓你控制你的腳本輸出的內(nèi)容,可以...

PHP輸出控制功能在簡(jiǎn)繁體轉(zhuǎn)換中的應(yīng)用概要:本文對(duì)PHP的輸出控制功能進(jìn)行了簡(jiǎn)單介紹并對(duì)其在簡(jiǎn)繁體轉(zhuǎn)化中的應(yīng)用給出了具體思路和實(shí)例

一 PHP 輸出控制功能介紹
PHP作為當(dāng)今流行的腳本語(yǔ)言之一,具有編寫簡(jiǎn)便,執(zhí)行速度快,擴(kuò)充性好等優(yōu)點(diǎn)。PHP的輸出信息控制函數(shù)可以讓你控制你的腳本輸出的內(nèi)容,可以用于許多不同的情況,特別是在你的腳本已經(jīng)輸出信息后需要發(fā)送文件頭的情況以及需要對(duì)輸出信息進(jìn)行編輯處理的地方。輸出控制函數(shù)不對(duì)使用 header() 或 setcookie() 發(fā)送的文件頭信息產(chǎn)生影響,只對(duì)那些類似于 echo()、print() 和 PHP 代碼的數(shù)據(jù)塊有作用。
例 1. 控制輸出
test.php
<?
function test($str){
return str_replace("php2000","y10k",$str);
}
ob_start("test");
echo "hello php2000";
ob_end_flush();
?>
這個(gè)程序在沒(méi)有輸出信息控制的情況下應(yīng)該輸出為
hello php2000
但通過(guò)指定了輸出控制函數(shù)后,輸出變?yōu)?
hello y10k
在上面的例子中,使用 echo() 的輸出內(nèi)容將會(huì)保存在輸出緩沖區(qū)中,直到調(diào)用了 ob_end_flush()或者腳本運(yùn)行終止, 然后輸出信息由自定義的處理函數(shù)進(jìn)行處理(替換里面的字符串)并返回結(jié)果。

相關(guān)函數(shù)說(shuō)明
ob_start([string output_callback])- 打開(kāi)輸出緩沖區(qū)
所有的輸出信息不在直接發(fā)送到瀏覽器,而是保存在輸出緩沖區(qū)里面,可選得回調(diào)函數(shù)用于處理輸出結(jié)果信息。
ob_end_flush - 結(jié)束(發(fā)送)輸出緩沖區(qū)的內(nèi)容,關(guān)閉輸出緩沖區(qū)

二 簡(jiǎn)繁體轉(zhuǎn)換的實(shí)現(xiàn)
一般通過(guò)對(duì)照表的形式實(shí)現(xiàn),相關(guān)的文章非常多,這里就不多講了,只給出其實(shí)現(xiàn)代碼
<?
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 的字庫(kù)對(duì)照表
$str 為要轉(zhuǎn)化的字符串
三 輸出控制函數(shù)在簡(jiǎn)繁體轉(zhuǎn)化中的應(yīng)用
目前的大多數(shù)網(wǎng)站的簡(jiǎn)繁體頁(yè)面轉(zhuǎn)換都是通過(guò)各自單獨(dú)的頁(yè)面實(shí)現(xiàn)的,這樣導(dǎo)致在修改簡(jiǎn)體頁(yè)面的時(shí)候還需要再次修改繁體的頁(yè)面,不能做到自動(dòng)同步。而我們提供的這個(gè)方法,可以實(shí)現(xiàn)同一個(gè)頁(yè)面自動(dòng)的變換簡(jiǎn)繁體顯示。其實(shí)現(xiàn)方法是:
1 建立簡(jiǎn)繁體標(biāo)志,用于指示當(dāng)前顯示的簡(jiǎn)繁體狀態(tài),同時(shí)對(duì)簡(jiǎn)繁體狀態(tài)進(jìn)行切換
php2000_gb_big5.php
<?
session_start(); // 打開(kāi)session 功能,用于在各個(gè)頁(yè)面之間自動(dòng)傳遞標(biāo)志
if(!session_is_registered("php2000_big5")){ // 檢查簡(jiǎn)繁體標(biāo)志的注冊(cè)狀態(tài)
session_register("php2000_big5"); // 注冊(cè)簡(jiǎn)繁體標(biāo)志,簡(jiǎn)體=0;繁體=1
$php2000_big5=0; // 默認(rèn)為簡(jiǎn)體
}
$php2000_big5 = ($php2000_big5+1)%2; // 切換簡(jiǎn)繁體狀態(tài)
header("location:".getenv("HTTP_REFERER")); // 返回其調(diào)用頁(yè)面
?>
2對(duì)頁(yè)面輸出信息進(jìn)行控制,每個(gè)頁(yè)面都調(diào)用這段程序,用于簡(jiǎn)繁體轉(zhuǎn)換
require.php(應(yīng)包括前面第二部分的轉(zhuǎn)換代碼,這里略)
<?
Session_start();
function translate_gb2big5($str) {
$str = gb2big5($str); // 轉(zhuǎn)化為 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)){ // 判斷標(biāo)志
$fp = fopen('big5.table', 'r'); // big5的字庫(kù)表
$_gb_big5_ = fread($fp, filesize('big5.table')); // 讀出數(shù)據(jù)
fclose($fp);
ob_start('translate_gb2big5'); // 啟動(dòng)輸出信息控制
}
?>
3 使用方法,這里給出一個(gè)最簡(jiǎn)單的例子,放在和 require.php 同一個(gè)目錄里面
test.php
<?
require("require.php");
echo "大家好,這里是 PHP 世紀(jì)網(wǎng)";
?>
<a href=php2000_gb_big5.php>
<?
if($php2000_big5==1)echo "GB";
else echo "Big5";
?>
</a>
第一次運(yùn)行結(jié)果為默認(rèn)簡(jiǎn)體如下
大家好,這里是 PHP 世紀(jì)網(wǎng) Big5
點(diǎn)擊 Big5 連接顯示繁體如下
大家好,這里是 PHP 世紀(jì)網(wǎng) GB
點(diǎn)擊 GB 將返回簡(jiǎn)體頁(yè)面
由于使用了session 保存了簡(jiǎn)繁體標(biāo)志,這樣其他任何使用了 require.php 的頁(yè)面都會(huì)自動(dòng)按照當(dāng)前的標(biāo)志顯示相應(yīng)的頁(yè)面。更多的實(shí)例請(qǐng)看我的網(wǎng)站 http://www.php2000.com。
4 big5 字庫(kù)的保存的改進(jìn)方法
曾經(jīng)考慮使用 session 來(lái)保存 big5 字庫(kù),但使用后發(fā)現(xiàn)速度明顯減慢,主要因?yàn)?session 也是通過(guò)文件形式實(shí)現(xiàn),所以不會(huì)對(duì)性能產(chǎn)生提高,而且因?yàn)閟ession 不會(huì)根據(jù)簡(jiǎn)繁體標(biāo)志自動(dòng)判斷裝載與否,所以造成在簡(jiǎn)體下也裝載了 big5 的字庫(kù),所以造成速度減慢。
由于我用的服務(wù)器為 linux 所以考慮使用共享內(nèi)存(Windows 不支持共享內(nèi)存)來(lái)保存 big5 字庫(kù)信息。其更改的代碼為require.php 的判斷部分:
<?
if(session_is_registered("php2000_big5") && ($php2000_big5==1))
{
// 修改成使用共享內(nèi)存
// 判斷是否已經(jīng)創(chuàng)建,打開(kāi)50000字節(jié)的 0xff3 段的共享內(nèi)存
$shm_id = @shmop_open(0xff3, "a", 0644, 50000);
if($shm_id) {
$_gb_big5_ = shmop_read($shm_id, 0,shmop_size($shm_id)); // 讀出big5 數(shù)據(jù)
}
else{
// 創(chuàng)建 50000 字節(jié)的系統(tǒng)標(biāo)識(shí)為 0xff3 的共享內(nèi)存塊
$shm_id = @shmop_open(0xff3, "c", 0644, 50000);

// 讀出數(shù)據(jù)
$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 數(shù)據(jù)
}
}
ob_start('translate_gb2big5');
}
?>
關(guān)于共享內(nèi)存的使用方法,請(qǐng)參看有關(guān)資料。
四 結(jié)論
PHP 作為一種公開(kāi)源代碼的腳本語(yǔ)言,其擴(kuò)充性是非常好的。本文只是對(duì)其一個(gè)功能的一種應(yīng)用方式的探討,并實(shí)現(xiàn)了比較完美的同一頁(yè)面自動(dòng)簡(jiǎn)繁體轉(zhuǎn)換功能。希望廣大愛(ài)好 PHP 的朋友能從中得到啟發(fā),做出更好的作品。