Python 编码问题

问题来源

Python3 中编码只存在于文件中, 读取文件进内存后统一都是 unicode。

如果读取文件时指定的编码与文件本身的编码不一致, 将导致编码错误而无法正确解析。

各个操作系统读取文件时采用的默认编码

Mac 操作系统和 Linux 操作系统默认字符编码都是 utf-8, 而 Windows 则根据不同地区使用不同的编码方式。

读取非 utf-8 的文件

在 Python3 中编码只存在于文件中, 读取后统一都是 unicode, 所以打开文件的时候就要指定编码, 而不是读取后指定。

exec(open('C:/Users/xxx/test.py', encoding="gbk").read())

一个有趣的问题, 在 windows 上

open(file, mode)

默认采用的是 GBK (中国地区), 而

python3 xx.py

采用的却是 utf-8

推荐使用 utf-8 编码

由于 utf-8 编码可以编码世界上所有国家语言中的字符, 因此我们可以放心地在文件使用 utf-8 编码格式, 相应的, 读取的时候必须使用 utf-8 编码读取。 以下是一些注意事项。

我很懒, 就想创建文件时默认使用 utf-8 怎么办?

借助于编辑器(IDE)时必须在文件头指定编码让编辑器识别, 以修改文件编码。 IDE 在全是 ASCII 字符时还是会使用系统默认的编码的, 不会去改变它。

使用 IDE 时在文件头指定编码:

  1. 带等号
#coding=<encoding name>
  1. ==带冒号==(大多数编辑器都可以正确识别的)推荐用这种
# -*- coding: <encoding name> -*-
  1. vim 的
# vim: set fileencoding=<encoding name> :

使用 IDE 时的推荐方式

在 Emacs 25.2.1 版本编辑器中, 使用 #coding= 方式, 当文本添加中文时 并不会改变文件编码,所以推荐使用带冒号的方式。

附: 查看文件编码的方法

Windows 操作系统下, 可以使用记事本打开文件, 一次点击 文件->另存为, 即可看到编码方式, 默认是 ANSI(根据用户所在地区使用不同编码方案, 如中国区采用 GBK, 美国 ASCII)。

附:windows 下的一些问题

由于 windows 系统采用的是 ANSI(美国标准) 的编码方案, 中国地区为 gbk 编码,

而有的 python 库使用 ASCII 编码, 含有中文的 py 脚本会因执行

exec(file, mode)

encoding="ANSI" (ANSI 在中国是 GBK)而产生解码错误。

附: 关于编码有一些不错的教程

字符串和编码 - 廖雪峰的官方网站

发表评论

评论内容
 

评论列表, 共 0 条评论