编码一直都是一个很让人头疼的问题,尤其是在python里面。花了几天时间,终于把这个问题给弄明白了。



一,什么是编码,编码过程是怎样的?常见的编码方式有哪些?

编码是从一个字符,比如‘哈’,到一段二进制码流的过程。解码是从一段二进制码流到一个字符的过程。

在编码的过程中,会涉及到三个名词:字符,内码,字符集。字符就是终端上显示的各个文字字母等。内码和字符是一一对应的关系。每一个字符都对应一个唯一的内码。内码在内存中的具体实现称为字符集。

注意:严格来说,编码指内码编码成字符集;解码指字符集解码为内码。

ascii不仅仅指英文对应的内码,还包括它的具体实现,也就是它的字符集。它是用一个字节存储每个内码的。

unicode是所有文字(包括英文,中文,日文等)所对应的内码的集合。

unicode的实现方式比较多样,常用的有UTF-8,GBK,GB18030。

其中,UTF-8是一种不定长的内码实现方式。

GB18030兼容GBK,GBK兼容GB2312。



二,系统编码方式查询更改命令有哪些?(linux)

locale是最核心的一个变量。它包括12个基本属性。这12个基本属性构成某个地区的语言习惯,日期,货币,单位等文化因素。LC_ALL是强制修改locale信息的命令。LANG是locale的默认设置命令。因此,当LC_ALL强制locale信息以后,LANG的设置也就失效了。



三,python中的编码问题

在python中,需要分清楚三种编码:系统编码,python编码,文件编码。先面说一下这三种编码的作用。

系统编码,通常也是写源码的编辑器的编码方式。它代表源码文件内的所有内容都是根据词方式编码成二进制码流,存入到磁盘中的。

系统编码可以通过locale命令查看(LINUX)。

python编码,是指python内设置的解码方式。如果不设定的话,python默认是ascii解码。它的设置方式有一下三种:

第一种:在源码文件开头(一定要是第一行):#coding=UTF-8,源码文件的设置解码方式为UTF-8

第二种:在源码文件开头(一定是第一行):#-*-coding:UTF-8-*-,源码文件的设置解码方式是UTF-8

第三种:

import sys

reload(sys)

sys.setdefaultencoding('UTF-8')

个人推荐前两种。前两种的区别在于,第二种能够被其他语言识别,第一种只使用于python

下面举例说明系统编码和python编码的作用。

系统编码:locale:gbk

python源文件test.py

#coding='UTF-8'

s='哈'

print s



在test.py保存的时候,会按照系统编码方式GBK的方式,编码成gbk二进制码流,存储到磁盘上。当运行该程序时。gbk二进制码流调入内存,并按照python设置的解码方式解码,也就是按照UTF-8的方式解码。所以,源文件中的汉字“哈”显示按照gbk方式,编码成二进制码流,然后按照UTF-8的方式解码成unicode内码。可以想象,结果不是错误提示,就是显示出来的是乱码。

还有一种情况需要用到python的默认解码方式。例如:

系统编码:locale:gbk

test.py

#coding='gbk'

s='哈'

ss=s.encode('UTF-8')

字符串s表示的是汉字“哈”的gbk编码的二进制码流(python中,所有字符串都表示的是相应的二进制码流,所有的unicode都表示的是相应的内码)。ss=s.encode('UTF-8')的过程中,会先对s的二进制码流,按照python设定的默认解码方式解码成unicode内码,然后对内码按照encode指定的编码方式编码。



在字符串的处理过程中,记住一句话:对二进制码流,按照解码的编码处理。怎么理解这句话呢?

例如:

print s

字符串s表示的是二进制码流,print函数把它交给系统,系统按照系统的编码方式解码饼显示。当然,如果系统的解码方式和s的编码方式不兼容的话,可能会报错或者乱码。

再例如:

f.write("%s\r\n"%str)

字符串str表示的是二进制码流,f是打开的指定文件。str二进制码流按照f文件的编码方式进行解码和编码,结果保存在f文件中。

为了安全起见,文件在打开的时候,最后指定文件编码方式



字符串和unicode的区别

字符串表示的是编码后的二进制码流,unicode表示的是内码。所以,为了避免解码错误的出现,最好使用unicode表示

unicode的定义,使用

1.s=u'哈':定义unicode字符串s。s表示的是哈的unicode内码

2.ss=unicode(s,'gbk'):对字符串s按照gbk方式解码,ss表示解码后的内码

3.import codecs

f=codecs.open(filename,'r','gbk‘)

s=f.read()

按照gbk方式读取filename,读取后的内容转变成unicode内码存在变量s中。

好了,记住上面这些,python中碰到编码问题,再也不会害怕了

转载 http://blog.sina.com.cn/s/blog_67852f560101fjtc.html

系统编码 python编码的更多相关文章

  1. python编码总结

    关于ASCII码和Unicode码的来源 计算机只能处理数字,如果要处理文本,需要先将文本转换成数字.早期计算机采用8bit作为一个字节(byte).所以一个字节最大为255(二进制11111111= ...

  2. 系统编码,文件编码,python编码

    系统编码,可以通过locale命令查看(LINUX)https://wiki.archlinux.org/index.php/Locale_(简体中文), centos7 配置文件在/etc/prof ...

  3. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  4. Python之路3【知识点】白话Python编码和文件操作

    Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...

  5. python编码规范

    python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...

  6. Python编码问题整理

    认识常见编码 GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码 GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名 cp936:中文本地系统是 ...

  7. Python编码与解码

    # -*- coding: utf-8 -*- # 直接保存为Python脚本,对照执行结果会好看点. # 实验的内容都是在Python 2.7.x下进行的. # Python3默认采用unicode ...

  8. python编码问题的理解与解决

    错误:'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 看到网上很多都不清楚,做了一天的 ...

  9. Python编码问题整理【转】

    认识常见编码 GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码 GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名 cp936:中文本地系统是 ...

随机推荐

  1. bignumber.js是一款用于任意精度十进制和非十进制算术的JavaScript库

    安装 npm install bignumber.js 引入 import { BigNumber } from 'bignumber.js' 实例方法 加法:plus 0.1 + 0.2 // 0. ...

  2. Nginx 别名访问

    #添加另一个域名,在浏览器中输入 etiantian.org,总是调到 www.etiantian.org server { listen            80; server_name   w ...

  3. PHP实现app唤起支付宝支付代码

    本文主要和大家分享PHP实现app唤起支付宝支付代码,希望能帮助到大家. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  4. java面试(反射)05

    1.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类信息以及动态调用对象内容就称为jav ...

  5. Transposed Convolution 反卷积

    Transposed convolutions也称作fractionally strided convolutions(本人比较喜欢这个称呼,比较直观),Upconvolution,deconvolu ...

  6. Spring AOP 在XML中声明切面

    转载地址:http://www.jianshu.com/p/43a0bc21805f 在XML中将一个Java类配置成一个切面: AOP元素 用途 <aop:advisor> 定义AOP通 ...

  7. java作业利用递归解决问题

    第一题 利用递归求组合数 设计思想 (1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算 (2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数 ...

  8. day_10猜年龄游戏函数版

    ''' 1. 在猜年龄的基础上编写登录.注册方法,并且把猜年龄游戏分函数处理,如 2. 登录函数 3. 注册函数 4. 猜年龄函数 5. 选择奖品函数 ''' import json real_age ...

  9. JAVA笔记18-容器之二增强的for循环(不重要)

    JDK1.5增强的for循环(foreach??)

  10. GO语言学习笔记4-int与string类型转换

    int与string类型之间相互转换可以借助strconv包里自带的函数实现. 1.string转换成int 函数原型: // base指定进制(2到36),如果base为0,则会从字符串前置判断, ...