linux之系统编码,python编码,

发布时间:2019-09-13 09:30:07编辑:auto阅读(1733)

    1     前言

    如果你对python2python3的中编解码很清楚,这里我认为你很清楚。

    具体参考文档:

    python2 encodedecode函数说明.docx

    “字符编码——从ASCII开始.docx

    以上所有文档均为本地文档。

    2     Python编码

    sys.getdefaultencoding(): 获取系统当前编码,这里的系统指的是python自己的内置系统,并非操作系统,即3中的python编码

    sys.setdefaultencoding(): 设置系统默认编码,执行dirsys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding(utf8),此时将系统默认编码设置为utf8

    sys.getfilesystemencoding(): 获取文件系统使用编码方式,Windows下返回’mbcs’,mac下返回’utf-8.

    这部分内容可参见“Python判断当前操作系统类型以及os, sys, platform模块简介”

    其实我认为这部分对后面的故障定位没作用。

    3     系统编码,python编码,文件编码

    3.1   系统编码

    默认写源码的编辑器的编码方式。它代表源码文件内的所有内容都是根据此方式编码成二进制码流。存入到磁盘中的。linux下通过locale命令查看。

    这部分编码就是所谓的编辑器的编码,例如vi命令。

    补充:如你在linux终端,直接从其他地方将文本拷贝如linux中,此时将采用系统编码进行编码,通过locale命令查看:

    [Asion@mobile220~]$ locale

    LANG=GBK

    LC_CTYPE="C"

    LC_NUMERIC="C"

    LC_TIME="C"

    LC_COLLATE="C"

    LC_MONETARY="C"

    LC_MESSAGES="C"

    LC_PAPER="C"

    LC_NAME="C"

    LC_ADDRESS="C"

    LC_TELEPHONE="C"

    LC_MEASUREMENT="C"

    LC_IDENTIFICATION="C"

    LC_ALL=C

    [Asion@mobile220Python3]$ more ENV.sh

    #!/bin/bash

    export LC_ALL="en_US.UTF-8"

    export LANG="en_US.UTF-8"

    [Asion@mobile220Python3]$ source ENV.sh

    [Asion@mobile220Python3]$ locale

    LANG=en_US.UTF-8

    LC_CTYPE="en_US.UTF-8"

    LC_NUMERIC="en_US.UTF-8"

    LC_TIME="en_US.UTF-8"

    LC_COLLATE="en_US.UTF-8"

    LC_MONETARY="en_US.UTF-8"

    LC_MESSAGES="en_US.UTF-8"

    LC_PAPER="en_US.UTF-8"

    LC_NAME="en_US.UTF-8"

    LC_ADDRESS="en_US.UTF-8"

    LC_TELEPHONE="en_US.UTF-8"

    LC_MEASUREMENT="en_US.UTF-8"

    LC_IDENTIFICATION="en_US.UTF-8"

    LC_ALL=en_US.UTF-8

    3.2   python编码

    python内设置的解码方式。如果不设定的话,python默认的是ascii解码方式。如果python源代码文件中不出现中文的话,这个地方怎么设定应该不会问题。设定方法:在源码文件开头(一定是第一行):#-*-coding:UTF-8-*-,源码文件的设置解码方式是UTF-8

    3.3   文件编码

    文本的编码方式,linuxvim利用set fileencoding查看。

    注意使用这个命令查看编码时,需保证locale下的

    LC_ALL="en_US.UTF-8"

    LANG="en_US.UTF-8"

    与你当时编码这个文件时一致,否则显示不出来。

    PS:当时我vi sendmail.py的文件编码是utf-8,即locale下显示是en_US.UTF-8

    [Asion@mobile220 Python3]$ ls

    ENV.sh sendmail.py

    [Asion@mobile220Python3]$ locale

    LANG=GBK

    ….

    LC_ALL=C

    这样的环境下去查看文件编码:

    wKioL1kYVbiTKgKZAAB1PfiJUvg804.png-wh_50


    中文显示直接乱码了,使用setfileencoding查看压根没有输出:

    wKiom1kYVbjA3fupAACAl5VVuVg864.png-wh_50

    环境初试回去后查看

    [Asion@mobile220Python3]$ source ENV.sh

    [Asion@mobile220Python3]$ locale

    LANG=en_US.UTF-8

    LC_ALL=en_US.UTF-8

    wKioL1kYVbnxeKpKAACFKDKAlaI397.png-wh_50

    4     总结

    就是你再牛逼的程序员,不推荐去动服务器的编码,除非服务器就只跑你自己的程序。


关键字