返回顶部
首页 > 资讯 > 后端开发 > Python >Python 编码处理-str与Unicode的区别
  • 190
分享到

Python 编码处理-str与Unicode的区别

区别Pythonstr 2022-06-04 18:06:35 190人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,Http参数等等 一运

一篇关于STR和UNICODE的好文章

整理下python编码相关的内容

注意: 以下讨论为Python2.x版本, Py3k的待尝试

开始

用python处理中文时,读取文件或消息,Http参数等等

一运行,发现乱码(字符串处理,读写文件,print)

然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码

所以调试时最常出现的错误

错误1

Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe6 in position 0: ordinal not in range(128)

错误2

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)

首先

必须有大体概念,了解下字符集,字符编码

ASCII | Unicode | UTF-8 | 等等

字符编码笔记:ASCII,Unicode和UTF-8

淘宝搜索技术博客-中文编码杂谈

str 和 unicode

str和unicode都是basestring的子类

所以有判断是否是字符串的方法

def is_str(s): return isinstance(s, basestring)

str和unicode 转换

decode 文档

encode 文档

str -> decode(‘the_coding_of_str‘) -> unicode unicode -> encode(‘the_coding_you_want‘) -> str

区别

str是字节串,由unicode经过编码(encode)后的字节组成的

声明方式

s = ‘中文‘ s = u‘中文‘.encode(‘utf-8‘) >>> type(‘中文‘) <type ‘str‘>

求长度(返回字节数)

>>> u‘中文‘.encode(‘utf-8‘) ‘xe4xb8xadxe6x96x87‘ >>> len(u‘中文‘.encode(‘utf-8‘)) 6

unicode才是真正意义上的字符串,由字符组成

声明方式

s = u‘中文‘ s = ‘中文‘.decode(‘utf-8‘) s = unicode(‘中文‘, ‘utf-8‘) >>> type(u‘中文‘) <type ‘unicode‘>

求长度(返回字符数),在逻辑中真正想要用的

>>> u‘中文‘ u‘u4e2du6587‘ >>> len(u‘中文‘) 2

结论

搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode)

下面是判断是否为unicode/str的方法

>>> isinstance(u‘中文‘, unicode) True >>> isinstance(‘中文‘, unicode) False >>> isinstance(‘中文‘, str) True >>> isinstance(u‘中文‘, str) False

简单原则:不要对str使用encode,不要对unicode使用decode (事实上可以对str进行encode的,具体见最后,为了保证简单,不建议)

>>> ‘中文‘.encode(‘utf-8‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe4 in position 0: ordinal not in range(128) >>> u‘中文‘.decode(‘utf-8‘) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)

不同编码转换,使用unicode作为中间编码

#s是code_A的str s.decode(‘code_A‘).encode(‘code_B‘)

文件处理,IDE和控制台

处理流程,可以这么使用,把python看做一个水池,一个入口,一个出口

入口处,全部转成unicode, 池里全部使用unicode处理,出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况)

读文件 外部输入编码,decode转成unicode 处理(内部编码,统一unicode) encode转成需要的目标编码 写到目标输出(文件或控制台)

IDE和控制台报错,原因是print时,编码和IDE自身编码不一致导致

输出时将编码转换成一致的就可以正常输出

>>> print u‘中文‘.encode(‘gbk‘) ???? >>> print u‘中文‘.encode(‘utf-8‘) 中文

建议

规范编码

统一编码,防止由于某个环节产生的乱码

环境编码,IDE/文本编辑器, 文件编码,数据库数据表编码

保证代码源文件编码

这个很重要

py文件默认编码是ASCII, 在源代码文件中,如果用到非ASCII字符,需要在文件头部进行编码声明 文档

不声明的话,输入非ASCII会遇到的错误,必须放在文件第一行或第二行

File "XXX.py", line 3 SyntaxError: Non-ASCII character ‘xd6‘ in file c.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
声明方法

# -*- coding: utf-8 -*- 或者 #coding=utf-8

若头部声明coding=utf-8, a = ‘中文‘ 其编码为utf-8

若头部声明coding=gb2312, a = ‘中文‘ 其编码为gbk

so, 同一项目中所有源文件头部统一一个编码,并且声明的编码要和源文件保存的编码一致(编辑器相关)

在源代码用作处理的硬编码字符串,统一用unicode

将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理

if s == u‘中文‘: #而不是 s == ‘中文‘ pass #注意这里 s到这里时,确保转为unicode

以上几步搞定后,你只需要关注两个 unicode和 你设定的编码(一般使用utf-8)

处理顺序

1. Decode early 2. Unicode everywhere 3. Encode later

相关模块及一些方法

获得和设置系统默认编码

>>> import sys >>> sys.getdefaultencoding() ‘ascii‘ >>> reload(sys) <module ‘sys‘ (built-in)> >>> sys.setdefaultencoding(‘utf-8‘) >>> sys.getdefaultencoding() ‘utf-8‘
str.encode(‘other_coding‘)

在python中,直接将某种编码的str进行encode成另一种编码str

#str_A为utf-8 str_A.encode(‘gbk‘) 执行的操作是 str_A.decode(‘sys_codec‘).encode(‘gbk‘) 这里sys_codec即为上一步 sys.getdefaultencoding() 的编码

‘获得和设置系统默认编码‘和这里的str.encode是相关的,但我一般很少这么用,主要是觉得复杂不可控,还是输入明确decode,输出明确encode来得简单些(个人观点)

chardet

文件编码检测,下载

>>> import chardet >>> f = open(‘test.txt‘,‘r‘) >>> result = chardet.detect(f.read()) >>> result {‘confidence‘: 0.99, ‘encoding‘: ‘utf-8‘}

u字符串转对应unicode字符串

>>> u‘中‘ u‘u4e2d‘ >>> s = ‘u4e2d‘ >>> print s.decode(‘unicode_escape‘) 中 >>> a = ‘\u4fee\u6539\u8282\u70b9\u72b6\u6001\u6210\u529f‘ >>> a.decode(‘unicode_escape‘) u‘u4feeu6539u8282u70b9u72b6u6001u6210u529f‘

以上就是对Python 编码处理的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

--结束END--

本文标题: Python 编码处理-str与Unicode的区别

本文链接: https://lsjlt.com/news/14294.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 编码处理-str与Unicode的区别
    一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 一运...
    99+
    2022-06-04
    区别 Python str
  • Effective Python bytes 与 str 的区别
    目录1、Python 有两种类型可以表示字符序列2、Unicode 数据和二进制数据转换3、使用原始的 8 位值与 Unicode 字符串3.1 问题一:bytes 和 str 的实...
    99+
    2024-04-02
  • Python中bytes与str的区别
    一、两种不同的数据类型 bytes是二进制数据,而str是Unicode文本。 在Python中,bytes是一个类型,用于代表字节串,是不可变序列,包含范围为0 <= x < 256的整数。bytes可以看做是bytearra...
    99+
    2023-10-29
    区别 Python bytes
  • Python Unicode与中文处理
    python中的unicode是让人很困惑、比较难以理解的问题,本文力求彻底解决这些问题; 1.unicode、gbk、gb2312、utf-8的关系;http://www.pythonclub.org/python-basic/enco...
    99+
    2023-01-31
    中文 Python Unicode
  • char str[] 与 char *str的区别详细解析
    复制代码 代码如下:char* get_str(void)  {      char str[] = {"abcd"}; ...
    99+
    2022-11-15
    char_str
  • Python中bytes与str有什么区别
    这期内容当中小编将会给大家带来有关Python中bytes与str有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。bytes实例包含的是原始数据,即8位的无符号值(通常按照ASCII编码标准来显示...
    99+
    2023-06-15
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2024-04-02
  • Unicode和Python的中文处理
    在Python语言中,Uincode字符串处理一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF-8还有其它许许多多的编码之间的区别而大伤脑筋。笔者曾经也是这“伤脑筋一...
    99+
    2022-06-04
    中文 Unicode Python
  • Python常用编码的区别介绍
    Python2内容默认ascii进行编码,而Python3对内容进行编码的默认为utf-8。这个编码问题,也不是Python的问题,所有语言都有乱码的问题,所以今天主要跟大家聊聊这4...
    99+
    2024-04-02
  • python处理读写与字符编码
    在Python中,可以使用内置的`open()`函数来处理文件的读写操作。`open()`函数接受两个参数:文件名和文件模式。文件模...
    99+
    2023-09-01
    python
  • Python 编码转换与中文处理
    Python 编码转换与中文处理python 中的 unicode是让人很困惑、比较难以理解的问题. utf-8是unicode的一种实现方式,unicode、gbk、gb2312是编码字符集.decode是将普通字符串按照参数中的编码格式...
    99+
    2023-01-31
    中文 Python
  • 聊聊Python 3 的字符串:str 和 bytes 的区别
    Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2...
    99+
    2023-06-02
  • python unicode编码设置的方法是什么
    在Python中,可以使用以下方法设置Unicode编码:1. 在脚本的开头添加`# -*- coding: utf-8 -*-`,...
    99+
    2023-09-25
    python
  • Python中多处理与多线程的区别是什么
    Python中多处理与多线程的区别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是线程你为什么想要它Python是一种线性语言。但是,当您需要更多的处理能力时,线程模...
    99+
    2023-06-16
  • 文件处理方面,Python与Laravel的区别是什么?
    在现代软件开发中,文件处理是一个非常重要的部分。在文件处理方面,Python和Laravel都是非常受欢迎的工具。但是,这两种工具之间有什么区别呢?本文将对Python和Laravel在文件处理方面的区别进行分析和比较。 Python是一种...
    99+
    2023-08-04
    编程算法 laravel 文件
  • python3 与python2 异常处理的区别与联系
    在python2.x中 ,异常是这样的处理的,异常基类后面加一个逗号“ ,” 然后跟着异常类型 import traceback try: 1/0 except Exception , err:...
    99+
    2022-06-04
    异常 区别
  • python中/与//的区别
    python中“/”表示为浮点数的除法,其返回结果为浮点数;而“//”表示的是整数除法,其返回结果为整数。实例:print("6 // 4 = " + str(6 // 4))print("6 / 4 =" + str(6 / 4))输出结...
    99+
    2024-04-02
  • python之 * 与** 的区别
    1.计算方面:*表示乘法       **表示指数幂运算 2.作为函数的参数: 1)调用函数时假设有函数 def test(a, b, c) test(*args):*表示传入的参数args是一个元组,把元组中的每一个元素按照次序作为参数...
    99+
    2023-01-30
    区别 python
  • 批处理与python代码混合编程的方法
    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值,比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写,bathome出品的命令工具包管理器bcn 使用了...
    99+
    2022-06-04
    批处理 代码 方法
  • Python之sklearn数据预处理中fit(),transform()与fit_transform()的区别
    目录sklearn数据预处理中fit(),transform()与fit_transform()的区别概述举例sklearn中归一化的坑原因 总结sklearn数据预处理中...
    99+
    2023-02-01
    Python sklearn数据预处理 Python中fit() Python中transform() Python中fit_transform()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作