PHP中字体应用释疑

综述:有许多朋友对网站提供繁、简两种版本感到很困惑,是怎么实现的呢?这也是时下众多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 的字符个数,如果半角字符为偶数,则表示位置刚好为整个汉字,如果为奇数,则为半个汉字,需要取下一个字符

时间: 2024-12-09 21:44:06

PHP中字体应用释疑的相关文章

textbox-有关XAML中的Header中字体大小的问题

问题描述 有关XAML中的Header中字体大小的问题 在练习WP8.1编程中,使用了TextBox控件,在XAML中如何更改HEADER的字体大小? 代码如下: </StackPanel> 解决方案 http://www.xuebuyuan.com/1097493.html

spinner-如何改变下拉列表中字体的颜色

问题描述 如何改变下拉列表中字体的颜色 关于Droid X的手机,用户反应说,在下拉列表中字体颜色变成白色,所以字体看不见,除非用户突出显示这一项.其他的手机没有出现这个问题.我要把字体强制的变成黑色来看看能否解决问题.我该怎么做呢? 这是我目前填充下拉列表的方法.看似simple_spinner_item在Droid X's中出错了. String spin_arry[] = new String[str_vec.size()]; str_vec.copyInto(spin_arry); Ar

安卓中autoCompleteTextview的下拉栏中字体颜色怎么改?

问题描述 安卓中autoCompleteTextview的下拉栏中字体颜色怎么改? 如上图所示,我输入"化"后,本应该弹出"化材院",但是在下拉栏中,"化材院"这三个字是白色的!我怎么改都无济于事,请问如何解决这个问题? 解决方案 适配器用android.R.layout.simple_list_item_1这个布局或者自己实现一个布局

javascript-JS:input的class添加无效,span中字体的大小并未修改

问题描述 JS:input的class添加无效,span中字体的大小并未修改 for (var i = 0; i <= data.length; i++) { var form = document.getElementById("main"); var li = document.createElement('li'); li.className = "collection-item avatar no-padding"; var img = documen

web前端开发-Echarts图表中字体设置问题(引入外部字体文件)

问题描述 Echarts图表中字体设置问题(引入外部字体文件) UI给出的界面字体确实很漂亮,找了半天找了个1M多的字体文件,页面字体都改好了,Echarts图表的字体只能在js里面设置,之前都用Chrome调,显示正常,现在马上全部调完了突然发现Echarts图表的字体在FF没有显示引入外部字体文件的字体,而是默认的宋体,这什么情况? 解决方案 http://www.stepday.com/topic/?949 不要用额外的字体,除非先下载字体到客户端的电脑.

Android使用selector修改TextView中字体颜色和背景色的方法_Android

本文实例讲述了Android使用selector修改TextView中字体颜色和背景色的方法.分享给大家供大家参考,具体如下: android中的selector大家都很熟悉了,用它可以很方便的实现,控件在不同的动作中,颜色等值的变化.这里我说一下TextView中的一些应用. 我想大家都知道,Button按钮在源码上看是一种特殊的TextView,所以我们很多时候,按钮全是使用的TextView来完成,只要加一个android:clickable="true"就可以了. TextVi

用ASP.NET(C#版)编写聊天室的过程中,如何通过选择DropDownList中的颜色相来使得文本框中字体颜色变化

问题描述 用ASP.NET(C#版)编写聊天室的过程中,如何通过选择DropDownList中的颜色来使得文本框中字体颜色变化?并且文本框中带有颜色的字体能显示到聊天记录中,聊天记录是另一个aspx页面--新手求大神指导! 解决方案 解决方案二:制定css样式,用js或jquery控制css样式变化解决方案三:说明你的"聊天消息"的表示协议.解决方案四:引用2楼sp1234的回复: 说明你的"聊天消息"的表示协议. 就是不懂怎么说明啊?麻烦大神再说清楚一点!谢谢@@

html-&amp;amp;lt;input type=&amp;amp;quot;submit&amp;amp;quot;&amp;amp;gt;按钮中字体大小怎么改变?

问题描述 <input type="submit">按钮中字体大小怎么改变? 中首页的大小怎么改变 ? 谢谢! 解决方案 <input type="submit" value='提交' style='font-size:40px'/> 解决方案二: 不会css么?最好使用css外部样 楼上的是行内样式40px表示字体大小可以自定义 解决方案三: 也是可以根据subBtnCss写css样式 解决方案四: <input type="

fckeditor配置与增加中字体方法

fckeditor配置与增加中字体方法 假设网站的目录为: 以下为引用的内容: website_root index.php教程 fckeditor  一.调用fckeditor 的两种方法 1.通过创建实例来调用 在 index.php 文件中,调用它的代码,把下面的代码加在需要编辑器的地方: 以下为引用的内容: <form name="frm1"> <?php //引用fckeditor.php这个文件,基本的类和数据结构都在这里 include_once(&qu