[問題]全論壇繁簡轉換

phpBB 2 MOD Support
無論是官方或非官方認證之外掛,安裝與使用問題討論。
(發表文章請按照公告格式發表,違者砍文)

版主: 版主管理群

主題已鎖定
china2000
星球公民
星球公民
文章: 194
註冊時間: 2003-10-24 23:00
來自: 傷講

[問題]全論壇繁簡轉換

文章 china2000 »

現回報一下使用狀況:

在I.E.下可以使用但Firefox下則沒有效用(無反應)!
頭像
kkt
竹貓忠實會員
竹貓忠實會員
文章: 625
註冊時間: 2005-06-15 01:37
來自: H.K.
聯繫:

文章 kkt »

To : china2000

多謝您的回報, 這問題我已知道了. 苦於無暇深入研究. (其實說功力不足還恰當 :oops: )

我曾參考倉木麻衣大的文章, 還未能融會貫通.
相信倉大或其他師長如能夠抽空研究, 肯定比我強百倍.

參考倉木麻衣大的文章

=============

以下是一篇關於 PHP 輸出控制功能在繁簡體轉換中的應用
衹可惜原作者網站已不存在: (本來還經常看了很多有價值的參考文章)
http://www.php2000.com

希望廣大愛好 PHP 的朋友能從中得到啓發, 做出更好的作品. (原作者留言)
而我在網上保存下這文章, 轉載出來讓更懂php 的高人保存. 存於我處真是有點浪費.

=============


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 的頁面都會自動按照當前的標誌顯示相應的頁面。
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 的朋友能從中得到啓發,做出更好的作品。


===========




ps. 當然有時間我會研究一下, 但有點吃力. :oops:






.
舊站台經已結朿了, 學生們可到遊戲站玩玩 Flash Game (不必註冊) 免費 Flash Game
在此學到很多架站知識, 永遠多謝:
心靈捕手老師, ~倉木麻衣~, 依夢兒 及 神川小羽各位大大相助
主題已鎖定

回到「外掛問題討論」