分享
 
 
 

PHP中字体应用释疑

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

综述:有许多朋友对网站提供繁、简两种版本感到很困惑,是怎么实现的呢?这也是时下众多PHP书籍中被漏掉的一个很重要的知识点。笔者搜集整理并根据自己的开发经验将一些重点与疑点罗列出来与大家共享!

如何应用繁体中文转换为简体中文的PHP函数<?

我们定义一个big5togb的函数来实现这个转换:

function big5togb($code)

{

//参数$code是big5码的字符串

include "data_big5.php"; //包含big5数据的文件

$output="";

$length=strlen($code); //取得字符串长度

$code=strtok($code,"");

$idx=0;

while ($idx < $length)

{

$tmpStr=$code[$idx].$code[$idx+1];

if (isbig5($tmpStr)) //判断是否big5码

{

……//如果是big5码则进行转换后输出

}

else

{

$output.= $code[$idx]; //如果不是big5码则直接输出

}

$idx++;

}

return ($output);

}

如何应用简体中文转换为繁体中文的PHP函数?

如何用PHP将简体中文转换为繁体中文?

我们定义一个big5togb的函数来实现这个转换:

function gbtobig5($code)

{

include "data_gb.php"; //包含有gb码的数据文件

$output="";

$length=strlen($code);

$code=strtok($code,"");

$idx=0;

while ($idx < $length)

{

$tmpStr=$code[$idx].$code[$idx+1];

if (isgb($tmpStr)) //判断是否gb码

{

……//如果是gb码转换后输出

}

else

{

$output.= $code[$idx]; //不是gb码则直接输出

}

$idx++;

}

return ($output);

}

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

PHP输出控制功能是怎样一回事?

PHP的输出信息控制函数可以让你控制你的脚本输出的内容,可以用于许多不同的情况,特别是在你的脚本已经输出信息后需要发送文件头的情况以及需要对输出信息进行编辑处理的地方。输出控制函数不对使用header()或setcookie()发送的文件头信息产生影响,只对那些类似于echo()、print() 和 PHP 代码的数据块有作用。

例 1. 控制输出

test.php

<?

function test($str){

return str_replace("world","php",$str);

}

ob_start("test");

echo "hello world";

ob_end_flush();

?>

这个程序在没有输出信息控制的情况下应该输出为

hello world

但通过指定了输出控制函数后,输出变为

hello php

在上面的例子中,使用echo()的输出内容将会保存在输出缓冲区中,直到调用了ob_end_flush()或者脚本运行终止,然后输出信息由自定义的处理函数进行处理(替换里面的字符串)并返回结果。

相关函数说明:

void ob_start([string output_callback])- 打开输出缓冲区

所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息。

void ob_end_flush(void) - 结束(发送)输出缓冲区的内容,关闭输出缓冲区

简繁体转换如何实现?

简繁转换一般通过对照表的形式实现,我们这里只给出其实现代码其中:

<?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 为要转化的字符串

输出控制函数在简繁体转化中如何应用?

目前的大多数网站的简繁体页面转换都是通过各自单独的页面实现的,这样导致在修改简体页面的时候还需要再次修改繁体的页面,不能做到自动同步。而我们提供的这个方法,可以实现同一个页面自动的变换简繁体显示。其实现方法是:

1 建立简繁体标志,用于指示当前显示的简繁体状态,同时对简繁体状态进行切换gb_big5.php

<?

session_start(); // 打开session 功能,用于在各个页面之间自动传递标志

if(!session_is_registered("big5")){ // 检查简繁体标志的注册状态

session_register("big5"); // 注册简繁体标志,简体=0;繁体=1

$ big5=0; // 默认为简体

}

$big5 = ($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("56big5") && ($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 "你好,欢迎光临!";

?>

<a href=gb_big5.php>

<?

if($big5==1)echo "GB";

else echo "Big5";

?>

</a>

第一次运行结果为默认简体如下

你好,欢迎光临!

点击 Big5 连接显示繁体如下

你好,歡迎光臨! GB

点击 GB 将返回简体页面

由于使用了session 保存了简繁体标志,这样其他任何使用了 require.php 的页面都会自动按照当前的标志显示相应的页面。

4 big5 字库的保存的改进方法

可以使用 session 来保存 big5 字库,但使用后速度会明显减慢,主要因为 session 也是通过文件形式实现,所以不会对性能产生提高,而且因为session 不会根据简繁体标志自动判断装载与否,所以造成在简体下也装载了 big5 的字库,所以造成速度减慢。

如果服务器为 linux 可以考虑使用共享内存来保存 big5 字库信息。其更改的代码为require.php 的判断部分:

<?

if(session_is_registered("big5") && ($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');

}

?>

如何分别全角和半角以避免乱码?

我们可以写这样一个函数来实现:

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;

}

这个函数原理就是截断一个字符,看看其ascII码是不是大于128,如果是,说明截断的是一个全角汉字,那么就退后一个截断。用$length控制长度

备注:循环判断字符串里面的 >128 的字符个数,如果半角字符为偶数,则表示位置刚好为整个汉字,如果为奇数,则为半个汉字,需要取下一个字符

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有