PHP中字体应用释疑

80酷酷网    80kuku.com

  综述:有许多朋友对网站提供繁、简两种版本感到很困惑,是怎么实现的呢?这也是时下众多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 为要转化的字符串

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 的字符个数,如果半角字符为偶数,则表示位置刚好为整个汉字,如果为奇数,则为半个汉字,需要取下一个字符



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: