最近在做搜集网络新闻相关内容时发现一个“奇怪”的字符集问题:利用Python代码存储的html文件,在PHP站点上显示乱码。
该代码编辑字符集为“UTF-8”,与html文件的头信息meta设置charset相同,与PHP7 + Apache24站点设置默认的charset相同。使用IE10+/Chrome77+从本地磁盘打开文件结果显示正常,但是以站点访问浏览网页的方式打开该html文件却出现乱码问题:除了英文字符,皆是无法直接阅读的乱码。
仔细检查操作代码,该代码将文件内容直接以raw string的形式通过file.write(arg0)写入存储。编辑器、网页meta字符集charset和网站服务器server设置反复确认一致,甚至输出到DOS命令窗口显示正常,目标网页结果都是以上描述的乱码。
这是一个似乎没有答案的谜题。
一个用作显示的文件,一般情况下,涉及的操作只有:读取和写入。读取操作的话,关联的是网站和网页的配置/设置/configuration的问题;而写入操作有关的是文件写入方式和文件格式。配置没有问题,那就似乎和读取没有关系。剩下的就是写入操作的问题。该操作代码使用HTML模板,复制时编辑器字符集charset为UTF-8,搜集内容字符编码不指定。假设模板格式正确,问题出现在搜集的文本上,推导结果应该是:模板固定的内容显示正确,搜索添加的文本显示为乱码。实际结果是:所有的文本均显现乱码。所以内容格式没有问题。
那么问题只能是与操作代码的file.write(arg0)有关。
我们知道,文件写入操作的方式有两种:1)raw string ;2)binary code。raw string一般指可读的原始字符串,不进行转换格式的。binary code是指转换的不可读二进制字符串。
在反复测试中,确定第一种写入方式存在问题。尝试修改写入方式为binary code二进制代码,结果显示正常。问题已解决。
总结:
1)编辑器、网页以及网站字符编码charset设置相同;
2)写入和读取一致:写入前的数据和读取时的数据内容和格式一致。
这里有个问题:为何raw string和binary code两种方式写入的文本显示结果不一样?