`
ihuashao
  • 浏览: 4562591 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

cnbook/TextPro6应用1:“字符实体”类型邮件乱码的分析

阅读更多

cnbook/TextPro6应用1:“字符实体”类型邮件乱码的分析

假设你收到一封邮件,邮件的内容是:

À´ÐÅÊÕµ½£¬Ð»Ð»

你能分析出这封邮件其实是在说“来信收到,谢谢”吗?本文讨论了这种乱码的由来,介绍了一种简单的解码方法。

1 乱码由来

很多情况都会产生乱码,处理的方法也各不相同。本文所说的这种乱码,它的文本中包含大量类似“À´”这样的字符串。熟悉HTML的朋友都知道这些字符串就是HTML中的字符实体。

1.1 字符实体

HTML为一些字符定义了特殊的表示方式,即字符实体。字符实体有两种形式:命名实体和数字实体。命名实体的格式是:

&字符名称;

例如“&”表示“&”,“À”表示“À”。数字实体的格式是:

&#字符的10进制Unicode编码;

例如“&”表示“&”,“À”表示“À”。

1.2 产生乱码

我们可以用CodeView查看“来信收到,谢谢”的编码,它的GBK编码是:

C0 B4 D0 C5 CA D5 B5 BD A3 AC D0 BB D0 BB

有的软件系统不支持中文,它把这些非ASCII字符(字节高位为1)用命名实体表示。例如用“À”表示C0,用“´”表示B4,这样就产生了前面提到的乱码:

À´ÐÅÊÕµ½£¬Ð»Ð»

2 解析乱码

解析这种乱码的方法是很明显的:

  1. 将命名实体或数字实体映射到对应的编码。
  2. 用常见的编码方式分析文本编码,得到有意义的文本。

根据这个思路,我们可以写一个小程序实现解码功能。不过我目前没时间写这个程序。本文介绍的方法是用我以前写的两个小工具解码: cnbook下载) 和 CodeView。CodeView可以查看文字编码。cnbook是我为自己定制的记事本(未完成)。

假设我们已经得到乱码邮件对应的编码,例如“C0 B4 D0 C5 CA D5 B5 BD A3 AC D0 BB D0 BB”,我们可以在CodeView中将编码转换到文本。我们可以按照GBK、big5等常见编码方式解码,直到得到有意义的文本。那么我们怎么从乱码邮件地得到CodeView期望的文本形式的编码呢?我们可以用cnbook的“自定义替换表”。

2.1 解析过程

cnbook允许用户自定义一张替换表,然后按照替换表中的所有替换对,替换指定或全部文本。我已经定义并装载了一张转换字符实体的替换表,下面简单描述解码过程:

  1. 将要分析的乱码复制到cnbook。
  2. 通过右键菜单选择“自定义替换->字符实体到编码”,就可以将乱码文本映射到编码。

  3. 将编码文本复制到CodeView,将编码转换到文本。

3.3节会介绍这张替换表作了哪些替换。

3 cnbook/TextPro6的替换功能

简要介绍与本文有关的cnbook功能。这里的介绍也适用于TextPro6

3.1 自定义替换

要使用cnbook的自定义替换功能,用户要先准备一张替换表。替换表是一个文本文件,每行的格式是:

源字符串=目标字符串

注释行以“=”开头。如果字符串包含“=”,必须写成“\=”。如果字符串包含“\”,必须写成“\\”。准备好替换表后,在cnbook中通过“设置->自定义替换表”进入自定义替换表的设置。

cnbook允许用户设置30张自定义替换表。选择要设置的替换表序号,点击“设置”按钮选择替换表源文件。点击“选项”按钮设置替换选项。“字符实体到编码”替换表的选项是:

设置后好,就可以通过编辑菜单或右键菜单执行自定义替换了。cnbook将替换表源文件和替换选项保存到cnbook所在目录的文件“tables\n.tab”,其中n是替换表序号。替换表的作者只要发布tab文件,其它用户就可以分享他的替换表。一个较好的做法是在发布tab文件的同时发布替换表源文件,在源文件开头用注释行说明替换选项。

3.2 替换选项

“使用转义符”选项设置是否解释替换字符串中的转义符。cnbook目前支持以下转义符:

\\ 字符'\'
\n 代表连续的回车符(0D)和换行符(0A)
\t 制表符(09)
\x"1-6位16进制数" 代表16进制Unicode编码对应的字符。
例如“\xA0”就是Unicode编码为0xA0的字符。
在替换表源文件中,“\”要写成“\\”。

还有一个需要解释的选项就是“快速替换”。这个选项控制替换的过程:

  1. 如果没有选择“快速替换”,替换表的执行过程就是顺序执行替换表中的每组替换。执行每组替换都会扫描全部文本,后面一次替换是在前面一次替换的结果上进行的。这时,替换的顺序可能影响替换的结果。
  2. “快速替换”只扫描一次文本。程序首先计算替换表源字符串的最大长度。扫描时从这个最大长度开始在替换表中查找匹配的源字符串。所以“快速替换”在每个扫描点会优先匹配最长的字符串。“快速替换”不支持正则表达式,因为使用正则表达式的源字符串匹配的字符串长度可能是变化的。

3.3 “字符实体到编码”替换了什么?

在替换表的设置对话框中,点击浏览按钮可以查看替换表内容,读者也可以阅读src目录的源文件。这张替换表中包含3组替换:

  1. 将编码255以内(含255,下同)的100个命名实体替换到对应的编码文本。
  2. 将编码128-255的128个数字实体替换到对应的编码文本。
  3. 将编码255以内的194个字符替换到对应的编码文本。这194个字符包括这个范围内的全部191个可打印字符以及3个常用的控制符:09、0D、0A。

从替换表的内容可见,“字符实体到编码”可以将编码在255以内的源文本全部替换成对应的编码。

结束语

本文介绍了怎么使用cnbook的自定义替换。 cnbook下载)的设计目标是一个快速、小巧、灵活的文本处理工具。可惜我没有时间完善它。我觉得至少还要加上“列模式”、“列出包含字符串的行”、“输入法感知”,我才可能把它作为默认的文本编辑器。不过,cnbook对四字节汉字的支持还是不错的,功能上也略强于“记事本”。

分享到:
评论

相关推荐

    cnbook中文记事本

    cnbook中文记事本

    LINUX操作系统(电子教案,参考答案)

    Linux的树型结构,Linux的文本编辑,Linux的安装和启动,用户管理,Shell编程技术,进程管理,C编译器,系统扩充,维护与监视,Linux的图形界面,网络的基本概念与设置,Linux在网络资源共享和电子邮件方面的应用,...

    中文词库素材

    用于文档编辑,里面包含很多有用的功能,欢迎大家下载!

    jSP在线教学质量评价系统的设计与实现(源代码)

    在线教学质量评价系统可以方便和全面地收集教师教学工作的数据,提供师生网上评教的评分结果,快速集中收集各方面的评教信息,使教务管理部门能够及时了解教学动态和师资情况,为教务老师提供相关决策支持,为职称评聘提供教学工作质量的科学依据,同时减轻了教务老师的工作量。

    python-3.10.7-amd64.zip

    python-3.10.7-amd64.zip

    自研扩散模型高光谱修复网络

    自研扩散模型高光谱修复网络 基于MST_Plus_Plus 网络改造。 试验数据 扩散模型loss初步测试降到了0.005,比不加扩散loss小了20倍, 训练入口 train_cos_img.py

    企业数据治理之数据安全治理方案.pptx

    企业数据治理之数据安全治理方案

    毕业设计基于Android的一个红外防盗报警源码.zip

    这是历年的毕业设计的项目,基于Android的一个红外防盗报警。需要自己添加蜂鸣器和热释电的硬件访问服务。

    短视频用户价值研究报告2022

    短视频用户价值研究报告2022

    基于springboot的食堂管理系统.zip

    基于springboot的java毕业&课程设计

    50.基于SSM的停车场管理系统的设计与实现-基于SSM+ Mysql+Java设计与实现(可运行源码+数据库+lw)毕业设计管

    可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) java期末大作业毕业设计项目管理系统计算机软件工程大数据专业 内容概要:首先在日常的出行中,老旧城区道路狭窄,容易造成车辆的堵塞,每天早晚,接送孩子的车辆数密集,会造成相应的交通堵塞情况。而同样的,在停车的管理上,一方面我国的停车场面积较少,停车位一位难求,特别是在现在的一些小区里,为了抢停车位而产生的矛盾也日益突出。另一方面在停车场的管理上也存在着较大的管理问题,进车容易出车难是当下的停车场所出现的主要问题。而现在的停车场管理系统眼花缭乱,效果水平也良莠不齐,停车场的管理是当下各大城市的公共设施发展的一大难题,而国家、各大省市也都开 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。

    基于SpringBoot的新闻管理发布系统,新闻后台管理系统。.zip

    基于springboot的java毕业&课程设计

    微信小程序设计-金融行业.rar

    微信小程序设计之相关行业源码及图文导入教程

    JAVA泡泡堂网络游戏的设计与实现(源代码+lw).zip

    网络游戏开发是一项很大的工程,需要很多综合性的知识。这对于刚刚入门的开发者来说很难理解。本论文从研究开发一个模仿泡泡堂网络游戏的例子出发,讲述网络游戏开发中用到的一些最基本的知识和设计思想,使大家清晰的理解游戏开发的过程。 整个设计中利用java中的swing编程,结合游戏的操作流程,对整个游戏进行精心的设计和大量的测试,实现游戏软件服务器端和客户端的开发,为玩家提供一个友好美观的操作界面,并添加聊天等功能以增加玩家之间的互动性,此外实现了可编辑场景地图的功能,使得游戏内容的更加丰富,玩家交互性更好,确保了游戏更具有趣味性、灵活性,以满足玩家对这款网络游戏的要求。

    外东洪路中段.m4a

    外东洪路中段.m4a

    软考3333333333

    软考3333333333

    Elasticsearch 的全文搜索功能使用方法

    附件是Elasticsearch 的全文搜索功能使用方法,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    CosmoChron:一种使用宇宙成因核素和直接年龄限制的多功能年龄深度建模方法matlab代码.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于springboot + websocket + html5 canvas打造网络版坦克大战.zip

    基于springboot的java毕业&课程设计

Global site tag (gtag.js) - Google Analytics