Python 中文编码问题

整个好活:micropython utf-8转gb2312 我大mpy对中文的支持惨啊!默认编码就是一个utf8,你用.encode()里面加各种参数是行不通的啦!上网搜utf8转gb2312,全是直接给你encode的,我是单片机啊大哥,有那能力我折腾什么还,所以一顿操作猛虎如之后,就有了下面这个无需任何依赖的转换工具啦,还不快收下!当然如果有更简便的算法欢迎联系我,我也不想这么折腾,但是为了壮大micropython,拼了。如上不需要任何库,但是因为查表,需要一个utf2gb2312.bin文件。 阅读详情

LovelyPython中的通用解决方案,使用chardet模块,该模块是用来检测目标编码的

  

 

为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。


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

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码


代码中字符串的默认编码与代码文件本身的编码一致

如:s='中文'

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。

如果字符串是这样定义:s=u'中文'

则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。


如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode) #用来判断是否为unicode

用非unicode编码形式的str来encode会报错


如何获得系统的默认编码

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()

该段程序在英文WindowsXP 上输出为:ascii


在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。

如在UliPad中运行如下代码:

s=u"中文"
print s

会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP 上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:print s.encode('gb2312')

则能正确输出“中文”两个字。

若最后一句改为:print s.encode('utf8')

则输出:/xe4/xb8/xad/xe6/x96/x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。


unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码

使用str.__class__可以查看str的编码形式


原理说了半天,最后来个包治百病的吧:)

复制代码 代码如下:


#!/usr/bin/env python
#coding=utf-8
s="中文"
if isinstance(s, unicode):
#s=u"中文"
print s.encode('gb2312')
else:
#s="中文"
print s.decode('utf-8').encode('gb2312')

 


 

对于Python的初学者来说,处理汉字估计是最头疼的一件事了,我也算是个初学者,断断续续接触Python也有一年多了,最近才终于搞明白了Python里对多字节字符的处理是怎么回事。

其实Python里对编码的处理能力还是很强大的,只是需要理解它处理字符的方式。Python里有两种字符串,str和unicode,他们都是字符的序列(相当于字符数组),区别在于字符的不同,str里一个字符就是一个字节,unicode中的一个字符是一个unicode里的字,长度可能是2字节,也可能是4字节。

Unicode是Python对多字节字符使用的一种内部编码,也就是说在Python内部处理多字节字符的官方编码,但它并不是我们常见的utf-8,具体是什么编码我也不清楚。在Python里处理字符串时,都需要先将来自文件、网络、或者str的字符串转换成Unicode格式,这一步是通过unicode工厂函数或者str的decode方法(decode可以理解为是从一种被编码的二进制字节流解码为Python内部通用的格式),但这是Python并不知道这个外部格式到底是什么格式,decode方法可以传入一个参数,表示这个数据是什么编码。

得到Unicode对象后,就可以对字符串进行各种操作了。在完成操作,要把字符串输出到文件、网络、或者数据库的时候,就要根据需要再把Unicode转换成需要的目标编码了,这是就要用到encode方法了,将字符串编码成需要的格式

MicroPython中文编码转换实战:SYN6288 TTS芯片的UTF-8转GB2312避坑指南 本文详细介绍了在MicroPython环境下,如何通过纯查表法和二分查找算法,实现UTF-8到GB2312编码的高效转换,以驱动SYN6288语音合成芯片。文章提供了完整的代码实现、映射文件生成方法及与SYN6288集成的实战指南,解决了嵌入式开发中常见的中文编码兼容性问题 阅读详情

相关推荐

嵌入式人工智能ESP32(7-OLED显示中英文)

硬件驱动开发专注于实现硬件的功能。而最难的是芯片设计,他要为硬件功能的实现提供芯片级的支持,就是利用MOS管的开关作用(门电路)实现芯片的底层功能,比如带进位加法器实现,RS触发器实现存储功能等,同学们在数字电路课程中也有一定的了解,这里我们还是回到OLED实验上来吧。由于ESP32开发板的RAM和ROM无法和树莓派媲美,我们不得不改变一下文件存放的位置,如果把所有的文件都放到根目录/下面,文件一多不太好管理,我们还是把各自的驱动放到各自的目录里面。注意OLED使用的引脚,如果不是22和21,请更换。

u010152658的博客 2719

Micropython oled中文显示 基于esp32,esp8266

参考资料:不知道大家在刚买回esp32开发板,和一个0.96寸的oled显示屏的时候有没有想要显示一些文字但却遇到一个致命的问题,就是官方提供的oled驱动不支持中文。这也使得我们很头疼,为此就出现了这篇文章。(虽然网上已经有大佬开发出来了,当是我觉得不够轻量,所以决定自己开发一个)想要开发能够中文显示的 oled 屏,那就必须解决如何让文字显示在oled上(废话)首先我的大概思路是这样的:那么我就开始解决第一个问题了,就是生成点阵图。这第一个问题就很好解决,因为网上有很多资料,但是有一个问题,那就是需要多

qq_51887218的博客 3001

最新测算源码PHP算命源码-风水八字-八字起名-塔罗牌占卜

未来,随着技术的发展和用户需求的变化,我们可以继续对系统进行升级和优化,以满足更多用户的需求和期望。数据库设计:创建一个名为bazi的数据库表,包含以下字段:id(自增ID)、name(姓名)、sex(性别)、birth_date(出生日期)、birth_time(出生时间)、bazi(八字结果)。数据库设计:创建一个包含塔罗牌信息的数据库表,如tarot_cards,包含字段:id(塔罗牌ID)、name(塔罗牌名称)、meaning(塔罗牌含义)等。根据操作系统的不同,PHP的安装方法会有所不同。

shanbeizi的博客 2397

(MySQL)gb2312_chinese_ci和gbk_chinese_ci以及gb2312_bin和gbk_bin的区别

gb2312_chinese_CI :只支持简体中文gb2312_BIN :而gb2312_bin可以说是gb2312_chinese_ci的一个子集,而且gb2312_BIN是二进制存储,区分大小写,数据库编码格式就意义不一样了gbk_chinese_CI :支持简体中文和繁体gbk_bin :解释同gb2312_BIN,对应gbk_chinese_CIMySQL字符集和整...

weixin_34197488的博客 444

python中文编码问题

python3 一般可以正常使用中文。 如果 出现中文编码问题报错,可以在文件开头加上#-*- coding: utf-8 -*- #!/usr/bin/env python #-*- coding: utf-8 -*- 这使用,中文注释不报错了,但是如果你 print("中文"),还是可能会运行错误。 这个时候,当前文件的编码格式可能就有问题, 先去设置vim的默认支持编码 vim /etc...

_Tsun 的博客 859

Python中文编码问题

python中文乱码

old-windbell 460

python 字典转字符串 中文编码问题

python 字典转字符串 中文编码问题 字典转字符串 json.dumps() 中文编码问题: json.dumps(huoshan_dict["filter_words"], ensure_ascii=False)

西山枫叶 4591

python解决中文编码问题

python解决中文编码问题    摘要:因为这段时间做python的中文数据梳理和爬虫,中文数据处理花费了我大量的时间,暂时不做这一块所以留下一些记录。为了快速完成文章,这里对很多文章进行了引用和摘抄,敬请原谅。  目录:  1.编码的基础知识  2.str与unicodedecode和encode  3.读取文件中出现的乱码问题  4.获取当前环境下默认编码                  ...

博客 1万+

python 中文编码问题

python 中文编码问题 首先第一行肯定要写: /# -- coding: UTF-8 -- 或者 /#coding:uft8 然后在输出的汉字字符前加个u printf u'你好' 遇到的问题: 在做数据库调试报错的时候,存在以下代码: try: tr_money.transfer(sourse_acctid,target_acctid,money) ...

didou8933的博客 144

python3 中文编码_Python3 中的中文编码问题

最近重新看看了Python3,撸了点代码.被中文编码问题套路了下,查了不少资料,写了总结就作为第一篇博客吧,如果有什么问题或错误,请与我联系.1 问题的根源计算机不能直接识别字符(文本的最小单位)但能处理数字,于是把字符转变为数字进行处理.所以任何信息,存放在存储介质中时,都是二进制流(比特流).2 编码和解码编码过程: 字符转换成二进制流表示的过程。解码过程: 二进制流转换成字符的过程。编码规则...

weixin_39622138的博客 737

python中文编码问题解决

python解决中文编码问题 摘要:因为这段时间做python的中文数据梳理和爬虫,中文数据处理花费了我大量的时间,暂时不做这一块所以留下一些记录。为了快速完成文章,这里对很多文章进行了引用和摘抄,敬请原谅。 目录: 1.编码的基础知识 2.str与unicodedecode和encode 3.读取文件中出现的乱码问题 4.获取当前环境下默认编码 交流圈 https://jq.qq.com/?_w...

weixin_45625815的博客 451

python学习教程,如何解决Python中文编码乱码问题

前面章节中我们已经学会了如何用 Python 输出"Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题Python 文件中如果未指定编码,在执行过程会出现报错: #!/usr/bin/python print "你好,世界"; ''' 在学习过程中有什么不懂得可以加我的python学习交流扣扣qun,934109170 群里...

Python新手学习之家 372

python中的中文编码问题

一、引言   无论学习什么程序语言,字符串这种数据类型总是着有非常重要。然而最近在学习python这门语言,想要显示中文,总是出现各种乱码。于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正常显示,有时候确实乱码,让我摸不着头脑。于是自己利用python读写中文的文本文件来尝试去摸索python中的中文编码问题。比较幸运的是,最后能够正常的读取出文本里面的中文数据并且显示,而且还...

weixin_34124577的博客 127

解决python中文编码错误问题

对于初学者而言,编码问题或许还没有没重视起来,但是编码问题是中文开发者必须面对的。今天来看下python开发中如何解决编码问题。注意:本篇讲的是最常见的一种编码问题,其他编码问题,如json函数引起的编码问题,其他函数的编码问题,以后会陆续为大家讲解。 编写程序的过程中会碰到中文字符串,但由于Python默认采用ASCII编码方式,所以对中文不支持。要解决此问题,必须设置当前编码方式为...

aewak462262的博客 308

python 中文编码类型 gb2312 gb180_关于Python中的中文编码问题

这篇文章介绍的内容是关于Python中的中文编码问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下1.python中的中文编码问题1.1 .py文件中的编码Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。 一个module的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),...

weixin_34768234的博客 4784

python中文编码问题

python是个好东西,“活好话少”。最近在用python处理mapinfo的midmif文件时遇到了一个中文编码问题。网上搜索研究了半天,终于得解。备忘以记之。 本想通过Python遍历midmif数据,对于满足条件的数据,update其字段属性值为某些中文,可是在python2或则3中都会报错。 Python3中报. , python2中报UnicodeDecodeErro...

u011210523的博客 220
上一篇: Python正则表达式指南
下一篇: STL中用erase()方法遍历删除元素
discxuwei
博客等级 码龄18年 22粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值