美文网首页
乱码问题原因分析

乱码问题原因分析

作者: lingnanlu | 来源:发表于2015-07-10 21:23 被阅读335次

自己经常在Linux和Windows下使用各种各样的软件,经常遇到的乱码的问题。

之前的对策是google XX软件 乱码 得到的结果往往是这样子的

Step1... Step2... Step3... ....

于是自己也跟着做,有时能成功,但有时依然乱码,只好放弃使用这个软件。

我想我的问题一直不知道为什么会出现乱码,当然,并不是完全不知,说起编码,也能说出个一二三来,什么unicode, utf-8, 转换编码之类的。但自己并没有一个清晰的概念。所以一直出问题,也不知道问题的根源在哪里。所以出了问题,解决问题的方式只能上网搜索,纯属碰运气。

直到前一段时间读到The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets这篇文章,发现自己有了那么一点点清晰的概念,之后在学Python Module of the Week中的编码时,仔细思考了一下,总算把乱码产生的原因想的大概明白了。

其实,说起来很简单,对于文本来说,主要有两种操作

  1. 将文本写入文件
  2. 从文件中读取

其中如果写入文件时和读取文件时使用的编码不一样,则可能会产生乱码,到这里似乎还很简单。

一般情形是这样子的,使用一个文件编辑器编辑一个文件,然后保存,保存的时候选取某一种编码,这一过程对应 1. 写入文件时的编码

读取文件时,往往使用文本编辑器打开一个文件,如果此时文本编辑器设定的编码方式与文件保存时使用的编码方式一样,那么显示的时候就不会有乱码,如果不一样,则可能产生乱码(如果保存时使用的编码是显示时设置的编码的子集,一般会正常显示)。这一过程对应 2. 从文件中读取

由以上可以看的出来,使用文本编辑器保存时是写入,使用文本编辑器打开文件时是读取。这种情况很简单。

但是, 写入文件读取文件 并非只有以上这种方式,而且 文件 也有可能不是通常所见到的那种。

写入文件 还可以是使用程序来生成一个文件,如

with codecs.open(filename, mode='w', encoding=encoding) as f:
    f.write(u'pi: \u03c0')

以上Python代码,这时,就要在代码中设置写入时的编码方式。这个还只是写入到普通文件。如果是程序员,应该还知道有一种文件叫做 标准输出文件 而这种文件并不一定是传统意义上的文件。而且,这里有一个比较容易误解

标准输出文件就是控制终端

其实,标准输出文件并不一定是控制终端,只不过常常和控制终端相连接,所以才有此误解。

好,现在的最复杂的情况是在程序中写内容到标准输出文件需要指定编码。

接下来的问题是,既然内容按照一定的编码写到了标准输出,这是一个写文件的过程,那么读文件呢?

以下讨论两种情况。

  1. 标准输出与终端连接:标准输出往往与终端连接,将内容显示在终端上,这里其实已经有了一个读文件的过程。在传统的读文件过程中,有一个文本编辑器,有一个打开文件的过程,但这里标准输出文件并不是一个可以看的见的实体。而这个过程中,文本编辑器又在哪里呢?呵呵,这里 充当文本编辑器角色的正是终端 。 所以通常所说的设置终端的编码就如同使用设置文本编辑器的编码一样。
  2. 标准输出与管道连接:这里负责 读文件 的是管道之后的程序。所以这里需要设置管道之后的程序中读文件所使用的编码。具体例子见PyMOTW中的codecs_stdin.py

其实要想搞清整个过程,有三个关键点最重要

  1. 写入过程指的是什么?
  2. 读出过程指的是什么?
  3. 文件又指的是什么?

涉及文本操作的均离不开以上三个部分,分析一个文本操作,找出以上三个部分的答案,让写入过程和读出过程的编码一致,就能解决乱码问题了。

相关文章

网友评论

      本文标题:乱码问题原因分析

      本文链接:https://www.haomeiwen.com/subject/wnkuqttx.html