|
|
big5 字库的保存的改进方法 ~ admin
可以使用 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 的字符个数,如果半角字符为偶数,则表示位置刚好为整个汉字,如果为奇数,则为半个汉字,需要取下一个字符
|