在任意字符集下正常显示网页的方法二(续)
发布时间:2023-11-22 17:36:14
转: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 编码。用它就更简单了。
猜你喜欢
- 啥也不说了,直接上代码吧!# encoding:utf-8import requests # 导入requests模块用于访问测试自己的ip
- 目录1、前言2、递归3、回调函数3.1匿名回调函数3.2带参数的回调函数3.3回调函数的优缺点4、自调函数5、为值的函数6、闭包1、前言在J
- 如何将训练好的网络进行保存,我们可以用pickle或cPickle来保存Keras模型,同时我们可以用下面的方法:一、保存整个模型model
- 我们在PyCharm安装配置Qt Designer+PyUIC教程中已配置好了PyCharm+QTDesigner+PyUIC环境这里在此基
- 在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。我们最常
- 前言gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的
- 1 硬件设备TTL串口摄像头(VC0706)USB转TTL烧录器2 serial安装第一次安装的是serial的包导包的时候发现下载错了,正
- 由于Node.js仅支持如下编码:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB23
- Python 高级专用类方法的实例详解除了 __getitem__ 和 __setitem__ 之外 Python 还有更多的专用函数。某些
- 介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用so
- 0.前言Telnet协议属于TCP/IP协议族里的一种,对于我们这些网络攻城狮来说,再熟悉不过了,常用于远程登陆到网络设备进行操作,但是,它
- 进程概述? 进程(Process)是计算机中已运行程序的实体。进程与程序不同,程序本身只是指令、数据及器组织形式的描述,进程才是程序(那些指
- 在日常开发中,我们前端必不可少的需要像后端请求数据。但是一般前后端分离,所以域名、端口等肯定不尽相同,这样就不可避免的会遇到浏览器的同源策略
- 本文实例讲述了js实现ajax分页的方法。分享给大家供大家参考,具体如下:<!DOCTYPE html PUBLIC "-/
- 经常使用word办公的小伙伴们经常会遇到邮件合并的任务,通常会将数量有限的表格中的信息通过word的邮件合并功能,自动生成word文档,操作
- 一、dim的定义TensorFlow对张量的阶、维度、形状有着明确的定义,而在pytorh中对其的定义却模糊不清,仅仅有一个torch.si
- 如下所示:class EmptyDelegate(QItemDelegate): def __init__(self,paren
- 经过测试发现mysql中用<>与!=都是可以的,但sqlserver中不识别!=,所以建议用<>selece * f
- 在使用python爬取网站信息时,查看爬取完后的数据发现,数据并没有被爬取下来,这是因为网站中有UA这种请求载体的身份标识,如果不是基于某一
- Pycurl包是一个libcurl的Python接口,由C语言编写的,功能强大,速度快。由于pycurl的属性和方法太多了,写这篇博文记录一