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 的字符个数,如果半角字符为偶数,则表示位置刚好为整个汉字,如果为奇数,则为半个汉字,需要取下一个字符。
关键字:PHP、数据、服务器
新文章:
- CentOS7下图形配置网络的方法
- CentOS 7如何添加删除用户
- 如何解决centos7双系统后丢失windows启动项
- CentOS单网卡如何批量添加不同IP段
- CentOS下iconv命令的介绍
- Centos7 SSH密钥登陆及密码密钥双重验证详解
- CentOS 7.1添加删除用户的方法
- CentOS查找/扫描局域网打印机IP讲解
- CentOS7使用hostapd实现无AP模式的详解
- su命令不能切换root的解决方法
- 解决VMware下CentOS7网络重启出错
- 解决Centos7双系统后丢失windows启动项
- CentOS下如何避免文件覆盖
- CentOS7和CentOS6系统有什么不同呢
- Centos 6.6默认iptable规则详解