Python字符编码转码之GBK,UTF8互转

作者:罗阿红 时间:2023-02-20 14:03:01 

一、Python字符编码介绍

1、须知:

在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode

unicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本,但是在文件里存的还是utf-8,因为utf8省空间

在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型

在unicode编码中 1个中文字符=2个字节,1个英文字符 = 1个字节,切记:ASCII是不能存中文字符的

utf-8是可变长字符编码,它是unicode的优化,所有的英文字符依然按ASCII形式存储,所有的中文字符统一是3个字节

unicode包含了所有国家的字符编码,不同字符编码之间的转换都需要经过unicode的过程

python本身的默认编码是utf-8

2、py2中的编码和转码的过程,如图:

Python字符编码转码之GBK,UTF8互转

注:因为unicode是中间编码,任何字符编码之前的转换都必须解码成unicode,在编码成需要转的字符编码

二、字符编码的转换

1、py2字符编码的转换,代码如下:


#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __auther__ == luoahong

s = "我是学员"
#utf-8解码成unicode编码
s_to_unicode = s.decode("utf-8")
print("--------s_to_unicode-----")
print(s_to_unicode)
#然后unicode再编码成gbk
s_to_gbk = s_to_unicode.encode("gbk")
print("-----s_to_gbk------")
print(s_to_gbk)
#gbk解码成unicode再编码成utf-8
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print("------gbk_to_utf8-----")
print(gbk_to_utf8)

#输出
--------s_to_unicode-----
我是学员
-----s_to_gbk------
�����˧
------gbk_to_utf8-----
我是学员

 注:以上这种情况适合字符是非unicode编码请款下,但是如果字符编码已经是Unicode的了咋办呢?广告回来,更加精彩。。。。。

2、字符编码已经是unicode情况下,代码如下:


#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __auther__ == luoahong

#u代码字符编码是unicode
s = u'你好'
#已经是unicode,所以这边直接是编码成gbk
s_to_gbk = s.encode("gbk")
print("----s_to_gbk----")
print(s_to_gbk)
#这边再解码成unicode然后再编码成utf-8
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print("-----gbk_to_utf8---")
print(gbk_to_utf8)
#输出
----s_to_gbk----
���
-----gbk_to_utf8---
你好

注:在python2中,在文件的开头指定字符编码,是要告诉解释器我现在的字符编码使用的是utf-8,那我在打印的中文时候,那么在utf-8中包含中文字符,那么可以打印出来。那么如果你不制定字符编码,默认使用系统编码,如果你的系统编码是ASCII,那么就会报错,因为ASCII不能存中文字符。

3、py3的字符编码转换

在须知中已经说到python 3的编码,默认是unicode,所以字符编码之间的转换不需要decode过程,直接encode即可,代码如下:


#! /usr/bin/env python
# __auther__ == luoahong
#无需声明字符编码,当然你声明也不会报错

s = '你好'
# 字符串s已经是unicode编码,无需decode,直接encode
s_to_gbk = s.encode("gbk")
print("----s_to_gbk----")
print(s_to_gbk)
#这边还是一样,gbk需要先解码成unicode,再编码成utf-8
gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
print("-----gbk_to_utf8---")
print(gbk_to_utf8)
#解码成unicode字符编码
utf8_decode = gbk_to_utf8.decode("utf-8")
print("-------utf8_decode----")
print(utf8_decode)

#输出
----s_to_gbk----
b'\xc4\xe3\xba\xc3'
-----gbk_to_utf8---
b'\xe4\xbd\xa0\xe5\xa5\xbd'
-------utf8_decode----
你好

 注:在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型,所以你就不难看出encode后的把它变成了一个bytes类型的数据。还有需要特别注意的是:不管是否在python 3的文件开头申明字符编码,只能表示,这个python文件是这个字符编码,文件中的字符串还是unicode,如下图:

三、总结:

1、uniocode能识别所有字符编码的字符串

2、在python 2中,字符编码之间的转化需要通过unicode才能转换,所以打印时,可以是使用unicode,也可以使用对应的字符编码(文件开头指定编码),打印字符或者字符串,因为py2中没有对字符和字节做明显区分,       所以才混导致这样的结果。

3、在python 3中,只有通过Unicode去识别字符的,如果转成编码成对应编码格式了,就直接变成对应编码的bytes类型的字节码,也就是二进制,需要识别,必须解码成Unicode才能识别

来源:https://www.cnblogs.com/luoahong/p/7159852.html

标签:Python,转码
0
投稿

猜你喜欢

  • Python调用腾讯API实现人脸身份证比对功能

    2023-11-27 20:18:06
  • python实现守护进程、守护线程、守护非守护并行

    2021-02-03 09:06:56
  • Python高级编程之继承问题详解(super与mro)

    2023-08-08 18:58:47
  • Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境详细过程(2023最新攻略)

    2023-06-06 21:28:07
  • 如何解决Oracle EBS R12 - 以Excel查看输出格式为“文本”的请求时乱码

    2024-01-22 01:17:55
  • Oracle中判断字段是否为数字

    2024-01-13 13:00:13
  • Django-Rest-Framework 权限管理源码浅析(小结)

    2021-11-02 06:18:49
  • php 参数过滤、数据过滤详解

    2023-11-17 17:36:56
  • windows、linux下打包Python3程序详细方法

    2023-09-30 22:06:53
  • 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    2024-01-15 18:21:30
  • Django 添加静态文件的两种实现方法(必看篇)

    2021-09-03 23:53:58
  • 如何利用python发送邮件

    2022-11-09 09:34:31
  • Python使用正则表达式实现爬虫数据抽取

    2021-01-22 15:00:24
  • phpword插件导出word文件时中文乱码问题处理方案

    2024-05-13 09:24:03
  • JavaScript中把数字转换为字符串的程序代码

    2024-05-03 15:59:46
  • Python的type函数结果你知道嘛

    2023-01-07 11:33:51
  • JS getRandomValues和Math.random方法深入解析

    2024-04-17 09:54:42
  • Dreamweaver MX 2004 制作树状菜单教程[动画]

    2010-03-25 12:24:00
  • 最基础的Python的socket编程入门教程

    2022-10-13 03:38:46
  • PL/SQL实现Oracle数据库任务调度

    2010-07-20 12:57:00
  • asp之家 网络编程 m.aspxhome.com