专栏首页老马说编程计算机程序的思维逻辑 (7) - 如何从乱码中恢复 (下)?

计算机程序的思维逻辑 (7) - 如何从乱码中恢复 (下)?

乱码

上节说到乱码出现的主要原因,即在进行编码转换的时候,如果将原来的编码识别错了,并进行了转换,就会发生乱码,而且这时候无论怎么切换查看编码的方式,都是不行的。

我们来看一个这种错误转换后的乱码,还是用上节的例子,二进制是(16进制表示):C3 80 C3 8F C3 82 C3 AD,无论按哪种编码解析看上去都是乱码:

UTF-8

ÀÏÂí

Windows-1252

ÀÏÂí

GB18030

脌脧脗铆

Big5

���穩

虽然有这么多形式,但我们看到的乱码形式很可能是"ÀÏÂí",因为在例子中UTF-8是编码转换的目标编码格式,既然转换为了UTF-8,一般也是要按UTF-8查看。

乱码恢复

"乱"主要是因为发生了一次错误的编码转换,恢复是要恢复两个关键信息,一个是原来的二进制编码方式A,另一个是错误解读的编码方式B。

恢复的基本思路是尝试进行逆向操作,假定按一种编码转换方式B获取乱码的二进制格式,然后再假定一种编码解读方式A解读这个二进制,查看其看上去的形式,这个要尝试多种编码,如果能找到看着正常的字符形式,那应该就可以恢复。

我们举个例子来说明,假定乱码形式是"ÀÏÂí",尝试多种B和A来看字符形式,如下图所示:

可以看出,第一行是正确的,也就是说原来的编码其实是A即GB18030,但被错误解读成了B即Windows-1252了。

恢复的讨论

可以看出,这种尝试需要进行很多次,上面例子尝试了常见编码GB18030/Windows 1252/Big5/UTF-8共十二种组合。这四种编码是常见编码,在大部分实际应用中应该够了,但如果你的情况有其他编码,可以增加一些尝试。

不是所有的乱码形式都是可以恢复的,如果形式中有很多不能识别的字符如�?,则很难恢复,另外,如果乱码是由于进行了多次解析和转换错误造成的,也很难恢复。

上面的尝试可以手工进行,借助文件编辑器如EditPlus, NotePad++, UltraEdit进行编码转换和切换查看编码的方式。

但我们是学编程的,这种尝试当然应该可以通过写程序自动进行,程序甚至应该可以自动判定哪些尝试是无效的,哪些尝试是可能有效的。

那怎么写程序呢?这个问题,由于牵涉的内容较多,此时我们暂不介绍,留待后续文章说明。

小结

上节和本节介绍了编码的知识,乱码的原因及恢复方法,这些都是与语言无关的。

接下来,是时候看看在Java中如何表示和处理字符了,我们知道Java中用char类型表示一个字符,但在第三节我们提到了一个问题,即"字符类型怎么也可以进行算术运算和比较?"。

我们需要对Java中的字符类型有一个更为清晰和深刻的理解。

本文分享自微信公众号 - 老马说编程(laoma_shuo)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 计算机程序的思维逻辑 (第7节更新) - 再谈乱码恢复

    在第6节和第7节,我们讨论了文本的二进制编码、乱码、以及恢复,第6节受到了很多读者的一致好评,但第7节有读者反馈解说的不太透彻,希望再详细一点,本文就是对第7节...

    swiftma
  • 计算机程序的思维逻辑 (6) - 如何从乱码中恢复 (上)?

    我们在处理文件、浏览网页、编写程序时,时不时会碰到乱码的情况。乱码几乎总是令人心烦,让人困惑。希望通过本节和下节文章,你可以自信从容地面对乱码,恢复乱码。 谈...

    swiftma
  • (25) 异常 (下) / 计算机程序的思维逻辑

    上节我们介绍了异常的基本概念和异常类,本节我们进一步介绍对异常的处理,我们先来看Java语言对异常处理的支持,然后探讨在实际中到底应该如何处理异常。 异常处理...

    swiftma
  • 实习杂记(32):getApplicationInfo或者getPackageManger出错

    getPackageManger  是通过binder通信的,最大通信是1M,而且这个binder通信是系统整个的,

    wust小吴
  • Ecplise设置全局编码为UTF-8的方法

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好让Java文件使用UTF-8编码。

    黑泽君
  • 驱动基础——字符设备1

    用户3765803
  • 一句话评述8个最热的原型工具

    早在十年前,要是提到原型工具,大概也只有笔纸和白板了。现如今,原型工具如雨后春笋般涌出,形式也各样,有在线的,也有桌面端的,让人目不暇接。今天小编就为大家吐血...

    奔跑的小鹿
  • 《Kotlin 极简教程》涉嫌抄袭

    最近发现 《Kotlin 极简教程》一书中关于 Native 的一章(第 16 章)与我很早在公众号发过的一篇文章 Kotlin Native 详细体验,你想要...

    bennyhuo
  • 软件安全性测试(连载5)

    XSS防护方法主要包括特殊字符转义和HTTPOnly。HTTPOnly上面已经介绍过,这里来介绍一下特殊字符转义。

    小老鼠
  • 手把手教你,嘴对嘴传达------Apache(安全优化防盗链、隐藏版本信息)

    防盗链就是防止别人的网站代码里面盗用服务器的图片,文件,视频等相关资源 如果别人盗用网站的这些静态资源,明显的是会增大服务器的带宽压力 作为网站的维护人员,...

    不吃小白菜

扫码关注云+社区

领取腾讯云代金券