PHP中字體應(yīng)用釋疑
如何應(yīng)用繁體中文轉(zhuǎn)換為簡體中文的PHP函數(shù)?
我們定義一個big5togb的函數(shù)來實現(xiàn)這個轉(zhuǎn)換:
function big5togb($code)
{
//參數(shù)$code是big5碼的字符串
include "data_big5.php"; //包含big5數(shù)據(jù)的文件
$output="";
$length=strlen($code); //取得字符串長度
$code=strtok($code,"");
$idx=0;
while ($idx < $length)
{
$tmpStr=$code[$idx].$code[$idx+1];
if (isbig5($tmpStr)) //判斷是否big5碼
{
……//如果是big5碼則進行轉(zhuǎn)換后輸出
}
else
{
$output.= $code[$idx]; //如果不是big5碼則直接輸出
}
$idx++;
}
return ($output);
}
如何應(yīng)用簡體中文轉(zhuǎn)換為繁體中文的PHP函數(shù)?
如何用PHP將簡體中文轉(zhuǎn)換為繁體中文?
我們定義一個big5togb的函數(shù)來實現(xiàn)這個轉(zhuǎn)換:
function gbtobig5($code)
{
include "data_gb.php"; //包含有g(shù)b碼的數(shù)據(jù)文件
$output="";
$length=strlen($code);
$code=strtok($code,"");
$idx=0;
while ($idx < $length)
{
$tmpStr=$code[$idx].$code[$idx+1];
if (isgb($tmpStr)) //判斷是否gb碼
{
……//如果是gb碼轉(zhuǎn)換后輸出
}
else
{
$output.= $code[$idx]; //不是gb碼則直接輸出
}
$idx++;
}
return ($output);
}
在簡繁體轉(zhuǎn)換中怎樣應(yīng)用PHP輸出控制功能?
PHP輸出控制功能是怎樣一回事?
PHP的輸出信息控制函數(shù)可以讓你控制你的腳本輸出的內(nèi)容,可以用于許多不同的情況,特別是在你的腳本已經(jīng)輸出信息后需要發(fā)送文件頭的情況以及需要對輸 出信息進行編輯處理的地方。輸出控制函數(shù)不對使用header()或setcookie()發(fā)送的文件頭信息產(chǎn)生影響,只對那些類似于echo()、 print() 和 PHP 代碼的數(shù)據(jù)塊有作用。
例 1. 控制輸出
test.php
<?
function test($str){
return str_replace("world","php",$str);
}
ob_start("test");
echo "hello world";
ob_end_flush();
?>
這個程序在沒有輸出信息控制的情況下應(yīng)該輸出為
hello world
但通過指定了輸出控制函數(shù)后,輸出變?yōu)?
hello php
在上面的例子中,使用echo()的輸出內(nèi)容將會保存在輸出緩沖區(qū)中,直到調(diào)用了ob_end_flush()或者腳本運行終止,然后輸出信息由自定義的處理函數(shù)進行處理(替換里面的字符串)并返回結(jié)果。
相關(guān)函數(shù)說明:
void ob_start([string output_callback])- 打開輸出緩沖區(qū)
所有的輸出信息不在直接發(fā)送到瀏覽器,而是保存在輸出緩沖區(qū)里面,可選得回調(diào)函數(shù)用于處理輸出結(jié)果信息。
void ob_end_flush(void) - 結(jié)束(發(fā)送)輸出緩沖區(qū)的內(nèi)容,關(guān)閉輸出緩沖區(qū)
簡繁體轉(zhuǎn)換如何實現(xiàn)?
簡繁轉(zhuǎn)換一般通過對照表的形式實現(xiàn),我們這里只給出其實現(xiàn)代碼其中:
<?php
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 為要轉(zhuǎn)化的字符串
4 big5 字庫的保存的改進方法
可以使用 session 來保存 big5 字庫,但使用后速度會明顯減慢,主要因為 session
也是通過文件形式實現(xiàn),所以不會對性能產(chǎn)生提高,而且因為session 不會根據(jù)簡繁體標(biāo)志自動判斷裝載與否,所以造成在簡體下也裝載了 big5
的字庫,所以造成速度減慢。
如果服務(wù)器為 linux 可以考慮使用共享內(nèi)存來保存 big5 字庫信息。其更改的代碼為require.php 的判斷部分:
<? if(session_is_registered("big5") && ($big5==1)) { // 修改成使用共享內(nèi)存 // 判斷是否已經(jīng)創(chuàng)建,打開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)識為 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'); } ?> |
如何分別全角和半角以避免亂碼?
我們可以寫這樣一個函數(shù)來實現(xiàn):
function ChgTitle($title) { $length = 46; //我們允許字符串顯示的最大長度 if (strlen($title)>$length) { $temp = 0; for($i=0; $i<$length; $i++) if (ord($title[$i]) > 128) $temp++; if ($temp%2 == 0) $title = substr($title,0,$length)."..."; else $title = substr($title,0,$length+1)."..."; } return $title; } |
這個函數(shù)原理就是截斷一個字符,看看其ascII碼是不是大于128,如果是,說明截斷的是一個全角漢字,那么就退后一個截斷。用$length控制長度
備注:循環(huán)判斷字符串里面的 >128 的字符個數(shù),如果半角字符為偶數(shù),則表示位置剛好為整個漢字,如果為奇數(shù),則為半個漢字,需要取下一個字符。
關(guān)鍵字:PHP、數(shù)據(jù)、服務(wù)器
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認iptable規(guī)則詳解