欢迎光临
我们一起进阶

Python编程入门-字符集问题

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

总结了一张表,更详细信息百度百科:

序号 年份 编码 标准协会 特点 二进制长度 字符长度 表现
1 1967 ASCII 美国国家标准学会
(American National Standard Institute , ANSI )
只能表示英文/数字/控制符符/现世符
不能表示中文
7位或8位二进制数组 1个字节 0~31,127(共33位)表示控制字符或者通信专用字符
32~126(共95为)表示字符,32是空格
48~57表示0~9个阿拉伯数字
65~90表示26个大写英文字母
97~122表示26个小写英文字母
其他表示标点符号和运算符号等
128~255是扩展ASCII,每个字符的第8位用于确定附加的128个特俗符号字符/图形/外来字母
2 1981 GB2312 中国国家标准总局 可以表示中文,图形字符
古汉字不能支持
2组8进制位 2个字节 3755个一级汉字
3008个二级汉字
682个拉丁/希腊字母/日文片假名/片假名字母/俄语西里尔字母
3 1995 GBK 中华人民共和国
全国信息技术标准化技术委员会
兼容GB2312
windowns中文版系统的编码
2组8进制位 2个字节 GB 2312 中的全部汉字、非汉字符号。
BIG5 中的全部汉字。
与 ISO 10646 相应的国家标准 GB 13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
其它汉字、部首、符号,共计 984 个。
4 2001 GB18030 信息产业部和国家质量技术监督局 1字节与ASCII兼容
2字节与DBK兼容
1/2/4个字节 70244多个,各种少数民族字符
5 1994 Unicode 非营利机构统一码联盟 跨语言跨平台
英文浪费一半以上空间存储
至少2个字节 英文1个字节
中文2个字节
16位来统一表示所有的字符
原来8位全部扩充到16位
6 6 UTF-8 Ken Thompson
RFC 3629
Unicode实现方式
伴随互联网出现
每次传输8位数据
使编码无国界
万国码
可变长 ASCII1个字节
欧洲字符2个字节
中文3个字节
编码体积大

python2.7

默认编码集是ASCII,如果直接encode(编码集),默认进行一次ascii解码

复制代码
>>> import sys
>>> print("系统默认编码是:",sys.getdefaultencoding())
('\xe7\xb3\xbb\xe7\xbb\x9f\xe9\xbb\x98\xe8\xae\xa4\xe7\xbc\x96\xe7\xa0\x81\xe6\x98\xaf\xef\xbc\x9a', 'ascii')
>>> s = "你好"
>>> s_to_gbk = s.encode("gbk")
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> s_to_gbk = s.decode().encode("gbk")
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
复制代码

需要进行一次明确解码

复制代码
>>> s = "你好"
>>> s_to_unicode = s.decode("utf-8")
>>> print(s_to_unicode)
你好
>>> s_to_gbk = s_to_unicode.encode("gbk")
>>> print(s_to_gbk)    #终端切换成GBK可以正常显示
▒▒▒
>>> gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
>>> print(gbk_to_utf8)
你好
>>>
#python2.7 字符串 -> unicode -> decode(原编码) -> encode(目标编码
复制代码

GB2312 -> UTF8 -> GBK -> UTF8 -> GB2312

复制代码
>>> import sys
>>> print("系统默认编码是:",sys.getdefaultencoding())
('\xe7\xb3\xbb\xe7\xbb\x9f\xe9\xbb\x98\xe8\xae\xa4\xe7\xbc\x96\xe7\xa0\x81\xe6\x98\xaf\xef\xbc\x9a', 'ascii')
>>>
>>> s = "你好"
>>> s_to_gb2312 = s.decode("utf-8").encode("gb2312")
>>> print(s_to_gb2312)  #终端编码为gb2312可以正常显示
▒▒▒
>>> s_to_gb2312_to_utf8 = s_to_gb2312.decode("gb2312").encode("utf-8")
>>> print(s_to_gb2312_to_utf8)
你好
>>> s_to_gb2312_to_utf8_to_gbk = s_to_gb2312_to_utf8.decode("utf-8").encode("gbk")
>>> print(s_to_gb2312_to_utf8_to_gbk) ##终端编码为gbk可以正常显示
▒▒▒
>>> s_to_gb2312_to_utf8_to_gbk_to_utf8 = s_to_gb2312_to_utf8_to_gbk.decode("gbk").encode("utf-8")
>>> print(s_to_gb2312_to_utf8_to_gbk_to_utf8)
你好
>>> s_to_gb2312_to_utf8_to_gbk_to_utf8_to_gb2312 = s_to_gb2312_to_utf8_to_gbk_to_utf8.decode("utf-8").encode("gb2312")
>>> print s_to_gb2312_to_utf8_to_gbk_to_utf8_to_gb2312
▒▒▒

复制代码

python3.5

默认编码是unicode

文件头部coding:gbk定义文件编码格式

但是程序本身依然是unicode编码格式,与文件格式无关

复制代码

# /usr/bin/env python
# -*- coding: gbk -*-
# Author:jenvid.yang
import sys
print("系统默认编码是:", sys.getdefaultencoding())
msg = '世界你好'
# unicode程序编码,文件头部定义的是文件编码
msg_unicode_to_gbk = msg.encode("gbk")
# 已经是unicode,只能encode成其他编码
print("unicode -> gbk: ",msg_unicode_to_gbk)

msg_unicode_to_utf8 = msg.encode("utf-8")
print("unicode -> utf8: ",msg_unicode_to_utf8)

msg_unicode_to_gb2312 = msg.encode("gb2312")
print("unicode -> gb2312: ",msg_unicode_to_gb2312)

msg_unicode_to_utf8_to_gbk = msg_unicode_to_utf8.decode("utf-8").encode("gbk")
# 默认decode成utf-8,可以不写,显示指定
print("unicode -> utf8 -> gbk: ",msg_unicode_to_utf8_to_gbk)

msg_unicode_to_utf8_to_gbk =msg_unicode_to_utf8.decode("utf-8").encode("gb2312")
# 默认decode成utf-8,可以不写,但显示指定
print("unicode -> utf8 -> gb2312: ",msg_unicode_to_utf8_to_gbk)
# gbk兼容gb2312
print(msg_unicode_to_utf8.decode("utf-8").encode("gb2312").decode("gb2312"))
print(msg.encode("utf-8").decode("utf-8"))
# decode的时候将字节码转换成字符串
# 用str方法指定原编码也可以转换成字符串
print(str(msg_unicode_to_utf8,encoding="utf-8"))
print(str(msg_unicode_to_gb2312,encoding="gb2312"))

输出如下:
# 系统默认编码是: utf-8
# unicode -> gbk:  b'\xca\xc0\xbd\xe7\xc4\xe3\xba\xc3'
# unicode -> utf8:  b'\xe4\xb8\x96\xe7\x95\x8c\xe4\xbd\xa0\xe5\xa5\xbd'
# unicode -> gb2312:  b'\xca\xc0\xbd\xe7\xc4\xe3\xba\xc3'
# unicode -> utf8 -> gbk:  b'\xca\xc0\xbd\xe7\xc4\xe3\xba\xc3'
# unicode -> utf8 -> gb2312:  b'\xca\xc0\xbd\xe7\xc4\xe3\xba\xc3'
# 世界你好
# 世界你好
# 世界你好
# 世界你好
复制代码

喜欢就点个赞!

赞(0) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏