手机
当前位置:查字典教程网 >编程开发 >php教程 >在任意字符集下正常显示网页的方法二(续)
在任意字符集下正常显示网页的方法二(续)
摘要:转:coolcode.cn前几天写了一篇在任意字符集下正常显示网页的方法,里面介绍的很简单,就是把前128个字符以外的字符集都用NCR来表示...

转:coolcode.cn

前几天写了一篇在任意字符集下正常显示网页的方法,里面介绍的很简单,就是把前128个字符以外的字符集都用NCR来表示,但是具体怎么转化我没有介绍,因为当时我觉得太简单了。但是后来发现有人问这个问题,这里就详细说明一下。

首先第一步是要把源字符集的字符串转化为UTF-16字符集,做这一步是因为UTF-16字符集中的每个字符都是两个字节,后面处理起来很容易,而如果在源字符集上直接做处理则很复杂。源字符集可以从原网页中的meta标签中获得,也可以单独指定,我的程序是让用户在表单中指定源字符集,因为我不能保证用户提交的文件就一定是HTML文件(其他文件也是可以的,比如这个WordPress的汉化包源文件是个po文件,它里面的内容也可以这样处理),而且即使是HTML文件,里面也不一定就有用于指定字符集的meta标签,所以通过表单单独指定字符集比较保险。你可能会觉得将一种字符集转化为另一种字符集很复杂,确实如此,如果自己来实现的话,确实非常麻烦,但是用PHP来做却很容易,因为它里面已经包含这样的函数了,你可以通过iconv函数很容易的来实现各种字符集之间的转化,如果你的机器上没有安装iconv扩展,你也可以使用mb_convert_encoding函数,如果MultibyteString扩展也没有安装,那就没办法了,因为你要自己实现那么多种编码的转化基本上是不可能的,除非你是顶级大牛!推荐使用iconv,因为这个效率高,支持的字符集也更多。

做完上面那一步之后,接下来是以每两个字节为单位对字符串进行处理。这两个字节直接转化为数字就是&#xxxxx;中的xxxxx,如果这个数字小于128就直接使用这个字符(注意这里就变成单字节了),否则就使用&#xxxxx;的形式。这里有一点要注意,就是当这个数字是65279(16进制的0xFEFF)时,请把它忽略掉,因为这个是Unicode编码中的传输控制字符,而我们现在的字符串已经只有iso-8859-1编码中的前128个字符了,所以我们不需要它了。

好了,基本思路就是这样,下面是实现的程序:

下载:nochaoscode.php

复制代码 代码如下:

<?php

functionnochaoscode($encode,$str){

$str=iconv($encode,"UTF-16BE",$str);

for($i=0;$i<strlen($str);$i++,$i++){

$code=ord($str{$i})*256+ord($str{$i+1});

if($code<128){

$output.=chr($code);

}elseif($code!=65279){

$output.="&#".$code.";";

}

}

return$output;

}

?>

函数的参数中,$encode是源字符集,$str是需要进行转化的字符串。返回结果是转化以后字符串。

补充:今天Legend告诉我一种更简单的方法,就是直接利用mb_convert_encoding函数。因为mb_convert_encoding支持一种叫做HTML-ENTITIES的编码格式,也就是NCR编码。用它就更简单了。

【在任意字符集下正常显示网页的方法二(续)】相关文章:

分页显示Oracle数据库记录的类之二

php实现将上传word文件转为html的方法

PHP 判断数组是否为空的5大方法

PHP正则验证Email的方法

php删除文本文件中重复行的方法

php使用for语句输出三角形的方法

php格式化电话号码的方法

php实现比较两个字符串日期大小的方法

在线竞拍系统的PHP实现框架(一)

php将字符串随机分割成不同长度数组的方法

精品推荐
分类导航