博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 的编码问题
阅读量:4330 次
发布时间:2019-06-06

本文共 1119 字,大约阅读时间需要 3 分钟。

老是碰到这个问题,决定好好给整理一番思路。

 

翻阅资料和实践证明,以下论述为真理:

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 
 
即:
 

 

 

可以通过:sys.setdefaultencoding统一为decode和encode指定编码。默认情况下也是统一采用相同的方式decode和encode。

因此很多时候出错:
cannot  decode xxxx
cannot encode xxxx
就是在这两个过程中出错的。
 
 

粗看有点脱裤子放屁的嫌疑:

假设我们的编码是gb2312,那么先转成unicode(decode过程)

然后再次转成gb2312(encode过程)。

 

实则不然,这是一个完全的设计,可以支持将某种编码: 外星编码 ---(decode)---->python能够识别的编码-----(encode)---->人类能够识别的编码

 

很多函数也支持在处理时指定编码,比如 simplejson的dumps函数,有个参数 enable_ascii (是否有ascii码进行decode、encode)

 

默认情况下,我们在py文件的头部统一指定编码,像下面这样:

# -*- coding:utf-8 -*-

然后有些时候,(比如在windows平台中文环境下),得到的编码如果不是utf-8编码,这个时候用python处理字符串,首先它会用utf-8进行decode,若字符串不是unicode码,那么就会报错。

 

那么,我们可能会想到,直接给你decode好, str.decode('已经的某种编码') ,

好吧,这样可以,但在接下来encode时会报错,因为默认会按照 utf-8进行encode。而且这个过程可能你控制不了,比如通过find进行查找。人家没提供参数给你设定encode时的编码。

 

这个时候解决方法有两个:

1. 将文件头默认的coding改成已知编码

   # -*- coding:已知编码 -*-

   注意,这种方式下的非英文字符,如果前面加了u,则表示unicode码,即python的内部编码,可能无法激活转码机制(不太确定)。

 

2. 采用sys.setdefaultencoding强行加载编码

   import sys

   reload(sys)

   sys.setdefaultencoding(已知编码)

 

 
 转载请注明来自: ,谢谢
 

转载于:https://www.cnblogs.com/Tommy-Yu/p/4020453.html

你可能感兴趣的文章
阶段3 2.Spring_01.Spring框架简介_05.spring的优势
查看>>
阶段3 2.Spring_02.程序间耦合_7 分析工厂模式中的问题并改造
查看>>
阶段3 2.Spring_02.程序间耦合_4 曾经代码中的问题分析
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_4 ApplicationContext的三个实现类
查看>>
阶段3 2.Spring_02.程序间耦合_8 工厂模式解耦的升级版
查看>>
阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
查看>>
阶段3 2.Spring_04.Spring的常用注解_3 用于创建的Component注解
查看>>
阶段3 2.Spring_04.Spring的常用注解_2 常用IOC注解按照作用分类
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_02.ssm整合之搭建环境
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_04.ssm整合之编写SpringMVC框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_5、SpringBoot2.x的依赖默认Maven版本...
查看>>
阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
查看>>