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


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 相关文章推荐
php获取某个目录大小的代码
Sep 10 PHP
php数组总结篇(一)
Sep 30 PHP
php trim 去除空字符的定义与语法介绍
May 31 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
从PHP的源码中深入了解stdClass类
Apr 18 PHP
php实现过滤表单提交中html标签的方法
Oct 17 PHP
详解Yii实现分页的两种方法
Jan 14 PHP
简单谈谈 php 文件锁
Feb 19 PHP
php 中的closure用法详解
Jun 12 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP中strval()函数实例用法
Jun 07 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中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
JS获取URL中的参数数据
2013/12/05 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
2020/03/17 Javascript
python中logging库的使用总结
2017/10/18 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
python实现抽奖小程序
2020/04/15 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
Weblogic和WebSphere不同特点
2012/05/09 面试题
为什么要使用servlet
2016/01/17 面试题
中专生学习生活的自我评价分享
2013/10/27 职场文书
函授大专自我鉴定
2013/11/01 职场文书
文秘专业大学生求职信
2013/11/10 职场文书
单位在职证明范本
2014/01/09 职场文书
八年级语文教学反思
2014/02/11 职场文书
2014年安全生产责任书
2014/07/22 职场文书
投诉书格式范本
2015/07/02 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
Golang bufio详细讲解
2022/04/21 Golang
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android