PHP輸出控制功能在簡繁體轉換中的應用
概要:本文對PHP的輸出控制功能進行了簡單介紹並對其在簡繁體轉化中的應用給出了具體思路和例項
來自:
原作者:y10k
[@more@]一 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$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 世紀網";
?>
if($php2000_big5==1)echo "GB";
else echo "Big5";
?>
第一次執行結果為預設簡體如下
大家好,這裡是 PHP 世紀網 Big5
點選 Big5 連線顯示繁體如下
大家好,這裡是 PHP 世紀網 GB
點選 GB 將返回簡體頁面
由於使用了session 儲存了簡繁體標誌,這樣其他任何使用了 require.php 的頁面都會自動按照當前的標誌顯示相應的頁面。更多的例項請看我的網站 。
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 的朋友能從中得到啟發,做出更好的作品。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/786540/viewspace-939867/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用JAVA轉換簡繁體的基礎知識 (轉)Java
- [擴充套件推薦]簡體轉繁體/繁體轉簡體 OpenCC-PHP 擴充套件套件PHP
- C#窗體應用中開啟控制輸出內容C#
- win10輸入法簡繁切換怎麼設定_win10電腦輸入法如何切換簡體繁體Win10
- 【c++】c++格式控制輸出簡單應用C++
- 繁體簡體互轉 OpenCC-PHP 擴充套件PHP套件
- 鴻蒙NEXT開發案例:簡體繁體轉換器鴻蒙
- PHP 輸出緩衝區應用PHP
- java 中文繁簡體轉換工具 opencc4jJavaOpencc4j
- Python 輕量化簡繁轉換Python
- Java輸出流在txt檔案中的換行控制Java
- PHP輸出緩衝控制- Output Control 函式應用詳解PHP函式
- 用ruby實現簡體中文和繁體中文的相互轉化
- GBK中文繁簡轉換函式函式
- python實現中文字元繁體和簡體中文轉換Python字元
- c# API實現簡繁體轉換的方法(kernel32.dll)C#API
- 用CLR整合為SQL 2005新增簡繁轉換功能SQL
- pyhanlp 繁簡轉換之拼音轉換與字元正則化HanLP字元
- 在英文版的Office 2007中實現 中文 繁體和簡體的相互轉換
- 整合中的小應用--檔案轉換或簡單的UIUI
- win10簡體繁體切換快捷鍵是哪個_win10快捷鍵怎麼切換簡體繁體Win10
- 在Delphi中捕獲控制檯程式的輸出 (轉)
- 漢語言處理工具pyhanlp的簡繁轉換HanLP
- PHP領域的術語對照(英中繁簡)PHP
- php輸出帶變數字串(echo函式的應用)PHP變數字串函式
- 管理的挑戰——軟技能在專案管理中的應用案例(轉)專案管理
- java 中文繁簡體轉換工具 opencc4j 使用介紹 1.8.0JavaOpencc4j
- Docker容器中應用程式的log輸出管理Docker
- ASM中多功控制檔案ASM
- C# 控制檯應用程式中輸出彩色字型C#
- PHP-Parse 簡介以及在 Hyperf 中的應用PHP
- 字串中大小寫轉換輸出字串
- PHP中的輸出:echo、print、printf、sprintf、pPHP
- PHP中動態HTML的輸出技術PHPHTML
- 將PHP應用無縫轉移到IIS中?PHP
- Java 迴圈&選擇 if&for 簡單應用 指定輸出Java
- C++中的檔案輸入/輸出(3):掌握輸入/輸出流 (轉)C++
- php當中的memcache應用PHP