目录

1.背景.

2.编码的理解

3.编码之间的相互转化

4. str类型说明

5. 可以使用的编码类型

6.参考文章

1.背景

Python中与其他程序进行交互时,如果存在字符串交互,特别是字符串中含有中文时,需要注意字符的格式,需要保持两边一致。

笔者在开发中遇到一个python 调用Labview编译的dll函数,需要输入一个字符串路径。当路径中含有中文时,由于两边编码不一致,会导致报错。

2.编码的理解

1. python 中写代码时,一般通过在一开始使用 # -*- coding: utf-8 -*- 或者其他告诉编译器当前代码默认的编码是什么,这里就是utf-8格式,现在比较通用。

当string_a = ‘Bing,你好’

Type(string_a) = str

可见当赋值一个字符串时,python 默认是str类型。

通过encode(‘utf-8’),decode(‘utf-8’)可以进行格式的编码或者解码。编码后的变量类型是bytes类型,完整的说应该是 按照utf-8格式编码的bytes类型。

我的中文环境的Labview中默认编码格式是gbk格式,所以我用python将字符串送入labview编译的dll中时,需要 先将 字符串编码成gbk格式,比如 string_a.encode(‘gbk’),当收到labview编译的dll函数中传出来的字符串时,需要先将收到的 string_b_out.decode(‘gbk’) 这样就能显示中文,而不是乱码了。

在python(笔者当前为3.7版本)中,为编码的字符串类型为str,无论编码成 ‘utf-8’还是‘gbk’,类型都会从str类型变为bytes类型。

下面我们结合代码理解:

s='Bing-中国-!'
print('type(s)',type(s))

打印如下内容----------------

type(s) <class 'str'>

打印内容结束----------------

a=s.encode('utf-8')
b=s.encode('gb2312')
c=s.encode('gb18030')
d=s.encode('gbk') print("a=s.encode('utf-8'), a=",a)
print("b=s.encode('gb2312'),b=",b)
print("c=s.encode('gb18030'),c=",c)
print("d=s.encode('gbk'),d=",d)

打印如下内容----------------

a=s.encode('utf-8'), a= b'Bing-\xe4\xb8\xad\xe5\x9b\xbd-\xef\xbc\x81'

b=s.encode('gb2312'),b= b'Bing-\xd6\xd0\xb9\xfa-\xa3\xa1'

c=s.encode('gb18030'),c= b'Bing-\xd6\xd0\xb9\xfa-\xa3\xa1'

d=s.encode('gbk'),d= b'Bing-\xd6\xd0\xb9\xfa-\xa3\xa1'

打印内容结束----------------

print('type(a)',type(a))
print('type(b)',type(b))
print('type(c)',type(c))
print('type(d)',type(d))

打印如下内容----------------

type(a) <class 'bytes'>

type(b) <class 'bytes'>

type(c) <class 'bytes'>

type(d) <class 'bytes'>

打印内容结束----------------

a=a.decode('utf-8')
b=b.decode('gb2312')
c=c.decode('gb18030')
d=d.decode('gbk') print("a=a.decode('utf-8'), a=",a)
print("b=b.decode('gb2312'),b=",b)
print("c=c.decode('gb18030'),c=",c)
print("d=d.decode('gbk'),d=",d)

打印如下内容----------------

a=a.decode('utf-8'), a= Bing-中国-!

b=b.decode('gb2312'),b= Bing-中国-!

c=c.decode('gb18030'),c= Bing-中国-!

d=d.decode('gbk'),d= Bing-中国-!

打印内容结束----------------

可见原来的内容又回来了,此时a,b,c,d的类型为str。

3.编码之间的相互转化

另一种情况,当我编码了utf-8后,是否可以从utf-8直接编码或者解码成 gbk格式

答案是不可以,必须先解码成 str类型,再重新编码为gbk编码的bytes类型。

所以其实编码解码之间还是有方向性的。

当变量类型为 str类型时,智能编码,使用encode(‘编码格式’)方法;当bytes类型时,按道理只用解码decode(‘编码格式’) 才不会出错。

上图:

GBK需要转化为utf-8的流程为:

1. 首先通过decode(‘gbk’)转化为 str 类型

2. 再通过encode(‘utf-8’)转化为编码为utf-8的bytes类型。

#%% 当编码了utf-8后需要转化为gbk,应该先解码,再重新编码成gbk,即不同编码格式之间不能直接转化。
s='Bing-中国-!'
print('type(s)',type(s)) a=s.encode('utf-8')
print('type(a)',type(a)) #--------------------------------------
b=a.encode('gb2312') # 会报错如下内容
# 会报错如下内容
# type(s) <class 'str'>
# type(a) <class 'bytes'>
# Traceback (most recent call last):
# File "D:\Python\decodeandencode.py", line 60, in <module>
# b=a.encode('gb2312')
# AttributeError: 'bytes' object has no attribute 'encode' #-----------------------------------
b=a.decode('gb2312') # 也会报错,当编码无法使用正确识别时。
# 会报错如下内容
# type(s) <class 'str'>
# type(a) <class 'bytes'>
# Traceback (most recent call last):
# File "D:\Python\decodeandencode.py", line 71, in <module>
# b=a.decode('gb2312')
# UnicodeDecodeError: 'gb2312' codec can't decode byte 0xad in position 7: illegal multibyte sequence

4. str类型说明

在网上看到有人说str类型在python中其实是按照unicode来保存的。但是会显性成str我们看到的字符。

5. 可以使用的编码类型

除了utf-8和gbk以外,还可以编码成很多类型。在python的帮助文档中摘取一小部分:

Codec

Aliases

Languages

euc_kr

euckr, korean, ksc5601, ks_c-

5601, ks_c-5601-1987, ksx1001,

ks_x-1001

Korean

gb2312

chinese, csiso58gb231280, euc

cn, euccn, eucgb2312-cn, gb2312-

1980, gb2312-80, iso-ir-58

Simplified Chinese

gbk

936, cp936, ms936

Unified Chinese

gb18030

gb18030-2000

Unified Chinese

hz

hzgb, hz-gb, hz-gb-2312

Simplified Chinese

iso2022_jp

csiso2022jp, iso2022jp, iso-2022-

jp

Japanese

iso2022_jp_1

iso2022jp-1, iso-2022-jp-1

Japanese

iso2022_jp_2

iso2022jp-2, iso-2022-jp-2

Japanese, Korean, Simplified Chi

nese, Western Europe, Greek

6.参考文章

https://www.jb51.net/article/179894.htm

字符编码之间的转换 utf-8 , gbk等,(解决中文字符串乱码)的更多相关文章

  1. 字符编码之间的相互转换 UTF8与GBK(转载)

    转载自http://www.cnblogs.com/azraelly/archive/2012/06/21/2558360.html UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 ...

  2. 【miscellaneous】【C/C++语言】UTF8与GBK字符编码之间的相互转换

    UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 CChineseCode 一 预备知识 1,字符:字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值." ...

  3. (2)字符编码关系和转换(bytes类型)

    ASCII 占一个字节,只支持英文 GB2312 占2个字节,只支持6700+汉字 GBK 是GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符编码 ks_c-5601-1987 ...

  4. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  5. Python常见字符编码间的转换

    主要内容:     1.Unicode 和 UTF-8的爱恨纠葛     2.字符在硬盘上的存储     3.编码的转换     4.验证编码是否转换正确     5.Python bytes类型 前 ...

  6. 《Python CookBook2》 第一章 文本 - 每次处理一个字符 && 字符和字符值之间的转换

    文本 - 总结: 什么是文本Python 中的string 类型是不可变类型.文本,一个字符的矩阵,每一个单独的文本快可以被缩进和组织起来. 基本的文本操作①解析数据并将数据放入程序内部的结构中:②将 ...

  7. Python - 字符和字符值之间的转换

    字符和字符值之间的转换 Python中, 字符和字符值, 直接的转换, 包含ASCII码和字母之间的转换,Unicode码和数字之间的转换; 也可以使用map, 进行批量转换, 输出为集合, 使用jo ...

  8. Delphi字符串、PChar与字符数组之间的转换

    来自:http://my.oschina.net/kavensu/blog/193719 ------------------------------------------------------- ...

  9. Linux 字符编码 查看与转换

    Linux 查看文件编码格式 Vim 查看文件编码 set fileencoding // 即可显示文件编码格式 若想解决Vim查看文件乱码问题, 可以在 .vimrc 文件添加 set encodi ...

随机推荐

  1. 华为云计算IE面试笔记-FusionCompute上的虚拟机A和虚拟机B不能正常通信,请描述可能的故障点和排除方法(分析虚拟机A和虚拟机B不通)

    *快速定位故障点:(考到) ARP:同一二层内可以通过ARP -a命令查询到要访问的主机IP(ARP表项中记录了同一二层中的IP和MAC的对应关系),若查询不到,说明二层出现问题(Vlan 间不通)或 ...

  2. JavaScript进阶面向对象ES6

    类和对象 对象:万物皆对象,对象是一个具体的事物,看得见摸得着的实物 对象是由属性和方法组成的: 属性:事物的特征,再对象中用属性来表示(常用名词) 方法:事物的行为,再对象中用方法来表示(常用动词) ...

  3. P6499-[COCI2016-2017#2]Burza【状压dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P6499 题目大意 \(n\)个点的一棵树,开始有一个棋子在根处,开始先手选择一个点封锁,然后后手封锁棋子所在点然后 ...

  4. Python : TypeError: 'int' object is not iterable

    用循环依次对list中的每个名字打印出 Hello, xxx! -------------------------------------------------------- L = ['Bart' ...

  5. C++ 多线程按顺序执行函数

    我们提供了一个类: public class Foo { public void first() { print("first"); } public void second() ...

  6. HTML选择器的四种使用方法

    选择器<style> 为了让.html代码更加简洁,这里引入选择器style 本文总共介绍选择器的四种使用方式 一.选择器的四种形式 1.ID选择器 id表示身份,在页面元素中的id不允许 ...

  7. Dapr + .NET Core实战(十三)跨语言开发

    因为基于Dapr的服务架构是不限语言的,我们来看看Dapr的跨语言开发.我们使用golang,python,.NET来实现跨语言的服务调用,拓扑如下 我们继续使用.NET 5的fontend和back ...

  8. 市区择房分析(ArcPy实现)

    1, 背景 如何找到环境好.购物方便.小孩上学方便的居住区地段是购房者最关心的问题.因此购房者就需要从总体上对商品房的信息进行研究分析,选择最适宜的购房地段. 2,目的 学会利用缓冲区分析和叠置分析解 ...

  9. 题解 Weak in the Middle

    题目传送门 Description 有一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\) ,每次可以删掉 \(a_i\),当 \(\min(a_{i-1},a_{i+1})>a_ ...

  10. FastAPI 学习之路(十六)Form表单

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...