在任意字符集下正常显示网页的方法二(续)


Posted in PHP onApril 01, 2007

转:coolcode.cn
前几天写了一篇在任意字符集下正常显示网页的方法,里面介绍的很简单,就是把前128个字符以外的字符集都用 NCR 来表示,但是具体怎么转化我没有介绍,因为当时我觉得太简单了。但是后来发现有人问这个问题,这里就详细说明一下。
首先第一步是要把源字符集的字符串转化为 UTF-16 字符集,做这一步是因为 UTF-16 字符集中的每个字符都是两个字节,后面处理起来很容易,而如果在源字符集上直接做处理则很复杂。源字符集可以从原网页中的 meta 标签中获得,也可以单独指定,我的程序是让用户在表单中指定源字符集,因为我不能保证用户提交的文件就一定是 HTML 文件(其他文件也是可以的,比如这个 WordPress 的汉化包源文件是个 po 文件,它里面的内容也可以这样处理),而且即使是 HTML 文件,里面也不一定就有用于指定字符集的 meta 标签,所以通过表单单独指定字符集比较保险。你可能会觉得将一种字符集转化为另一种字符集很复杂,确实如此,如果自己来实现的话,确实非常麻烦,但是用 PHP 来做却很容易,因为它里面已经包含这样的函数了,你可以通过 iconv 函数很容易的来实现各种字符集之间的转化,如果你的机器上没有安装 iconv 扩展,你也可以使用 mb_convert_encoding 函数,如果 Multibyte String 扩展也没有安装,那就没办法了,因为你要自己实现那么多种编码的转化基本上是不可能的,除非你是顶级大牛!推荐使用 iconv,因为这个效率高,支持的字符集也更多。
做完上面那一步之后,接下来是以每两个字节为单位对字符串进行处理。这两个字节直接转化为数字就是 &#xxxxx; 中的 xxxxx,如果这个数字小于 128 就直接使用这个字符(注意这里就变成单字节了),否则就使用 &#xxxxx; 的形式。这里有一点要注意,就是当这个数字是 65279(16 进制的 0xFEFF)时,请把它忽略掉,因为这个是 Unicode 编码中的传输控制字符,而我们现在的字符串已经只有 iso-8859-1 编码中的前 128 个字符了,所以我们不需要它了。
好了,基本思路就是这样,下面是实现的程序:
下载: nochaoscode.php

<?php 

function nochaoscode($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); 

        } else if ($code != 65279) { 

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

        } 

    } 

    return $output; 

} 

?>

函数的参数中,$encode 是源字符集,$str 是需要进行转化的字符串。返回结果是转化以后字符串。
补充:今天 Legend 告诉我一种更简单的方法,就是直接利用 mb_convert_encoding 函数。因为 mb_convert_encoding 支持一种叫做 HTML-ENTITIES 的编码格式,也就是 NCR 编码。用它就更简单了。
PHP 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
PHP MSSQL 存储过程的方法
Dec 24 PHP
php PDO中文乱码解决办法
Jul 20 PHP
php中用socket模拟http中post或者get提交数据的示例代码
Aug 08 PHP
跟我学Laravel之路由
Oct 15 PHP
php截取中文字符串函数实例
Feb 23 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
PHP 微信支付类 demo
Nov 30 PHP
一段实用的php验证码函数
May 19 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
在任意字符集下正常显示网页的方法一
Apr 01 #PHP
用PHP实现的生成静态HTML速度快类库
Mar 31 #PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 #PHP
实现dedecms全站URL静态化改造的代码
Mar 29 #PHP
PHP中动态显示签名和ip原理
Mar 28 #PHP
收集的PHP中与数组相关的函数
Mar 22 #PHP
用PHP写的MySQL数据库用户认证系统代码
Mar 22 #PHP
You might like
PHP简单选择排序算法实例
2015/01/26 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
php实现简单爬虫的开发
2016/03/28 PHP
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
python函数的万能参数传参详解
2019/07/26 Python
python绘制动态曲线教程
2020/02/24 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
商得四方公司面试题(gid+)
2014/04/30 面试题
运动会通讯稿400字
2014/01/28 职场文书
应聘护理专业毕业自荐书范文
2014/02/12 职场文书
万年牢教学反思
2014/02/15 职场文书
仓管员岗位责任制
2014/02/19 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL