python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」假设读者已经了解了什么叫字符集,什么叫编码,什么叫解码。首先要明确,虽然有三种前缀(无前缀,前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下:根据程序以及以上运行结果,发现无前缀,和前缀u,构造出来的字符串常量,是一样的。类型一样是str,长度一样是3,==判断也是返回true。其实,这里是因为,python3中,字符串的存储方式都是以Unicode字符…

大家好,又见面了,我是你们的朋友全栈君。

假设读者已经了解了什么叫字符集,什么叫编码,什么叫解码。

首先要明确,虽然有三种前缀(无前缀,前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下:

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」         python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」  python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」  python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」

根据程序以及以上运行结果,发现无前缀,和前缀u,构造出来的字符串常量,是一样的。

类型一样是str,长度一样是3,==判断也是返回true。is判断也是返回true。

其实,这里是因为,python3中,字符串的存储方式都是以Unicode字符来存储的,所以前缀带不带u,其实都一样。

结论:字符串常量,前缀带不带u,都是一样的

 

不管是utf-8,还是gbk,都可以理解为一种对应关系(若干个十六进制数<——>某个字符):

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」      python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」

所以可以发现任何str类型的字符串,在经过encode(‘utf-8’)后,就是通过utf-8这种编码解码方式(两种方向),将Unicode字符转换为对应的以字节方式存储的若干十六进制数。

根据如上程序以及结果,可以发现,utf-8用三个字节(6个十六进制数)来表示一个中文字符,而gbk用两个字节(4个十六进制数)来表示一个中文字符。

结论:encode()函数根据括号内的编码方式,把str类型的字符串转换为bytes字符串,字符对应的若干十六进制数,根据编码方式决定

 

既然知道了,str实际存储的是Unicode字符,那么也可以Unicode编码来存储str,形如\u1234:

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」发现\u后面跟四个十六进制数,就可以代表一个Unicode字符,同样的,前缀带不带u都一样。

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」     python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」

结论:str类型的字符串,每个字符用字符本身或者\u1234,来表示都可以,后者则是直接是Unicode编码。但打印时都是打印字符本身

 

bytes字符串的组成形式,必须是十六进制数,或者ASCII字符:

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」

提示错误:bytes只能包含ASCII字符。

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」在打印bytes字符串时,某些正常字符和一些转义字符可以打印出来,比如:字母数字和‘\n’换行符。别的就只能以原来的方式存在。

python3 三种字符串(无前缀,前缀u,前缀b)与encode()「建议收藏」

还可以对bytes取索引,所以这里bytes也可以用for循环来迭代了,因为也是可迭代对象。

取索引,将所在元素的数,转换为十进制数。

代码:

oath = '我爱妞'
print(type(oath))
print(len(oath))

oath1 = u'我爱妞'
print(type(oath1))
print(len(oath1))

print(oath==oath1)


utf8 = oath.encode('utf-8')
print(type(utf8))
print(len(utf8))
print(utf8)

gbk = oath.encode('gbk')
print(type(gbk))
print(len(gbk))
print(gbk)


out = open('test.txt','w',encoding = 'utf-8')

test = u'\u5220\u9664'
print(len(test))
print(test)
test1 = test.encode('utf-8')
print(test1)
print(type(test1))

out.write(test)
out.close()

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137941.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 将python打包成exe_python程序打包成安装包

    将python打包成exe_python程序打包成安装包Python Windows下打包成exe文件

    2022年4月21日
    55
  • 突破思维的障碍

    突破思维的障碍译者的话   在众多的讲述思维及创造性的书中,这是一本普通的小册子,但它却是吸引人的。作者用妙趣横生而又日常可见的素材向我们娓娓叙说了人人都会关心的问题,即我们是否意识到自己的思维障碍,怎样克服它,让自己变得更富有创造活力。   这本书在美国一版再版,风靡一时,拥有广泛的读者,无论是从事研究工作的高级学者、研究人员,还是从事行政、工商和管理活动的人士或普通学生。相信本书与中国读者的见面

    2022年5月5日
    35
  • linux查看iostat_ios命令行怎么打开

    linux查看iostat_ios命令行怎么打开简介iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。命令格式及参数iostat[-c|-d][-k|-m][-t][-V][-x][device[…]|ALL][-p[…

    2022年10月6日
    6
  • 语义分割如何做标注_语义分割转实例分割

    语义分割如何做标注_语义分割转实例分割在进行Segmentation训练之前需要准备训练集和验证集,本文将要来介绍如何使用LabelMe进行标记。LabelMe是个可以绘制多边形、矩形、圆形、直线、点的一套标记工具,可用于分类、目标检测、语义分割、实例分割任务上的数据标注。1.label安装与数据标注首先安装LabelMe,我使用Anaconda进行安装。打开AnacondaPrompt执行以下指令:pipinstalllabelme接着输入labelme会出现以下UI介面,点选OpenDir选择要标记的图片资料

    2022年8月23日
    14
  • php sigpipe,遭遇SIGPIPE[转]

    php sigpipe,遭遇SIGPIPE[转]转自:http://www.diybl.com/course/3_program/c++/cppjs/20090831/173152.html我写了一个服务器程序,在Windows下在cygwin环境编译后执行,然后用C#写了多线程客户端进行压力测试.程序一直运行正常.但当在Linux下测试时,总是莫名退出.最后跟踪到是write调用导致退出.用gdb执行程序,退出时提示”Broken…

    2022年5月30日
    36
  • 清除vs2005、vs2008起始页最近打开项目

    清除vs2005、vs2008起始页最近打开项目

    2021年11月17日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号