Zz_king 发表于 2021-3-25 17:13:21

求助各位大佬!!!!《零基础入门学习python》,第30讲的作业4的代码,运行出现问题

各位大佬大佬!!!T-T,QAQ
为什么我在学习《零基础入门学习python》时,第30讲的作业4的代码,运行后报错:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 44: illegal multibyte sequence
要在open那里改成f = open(file_name,'r',encoding='utf-8')才可以正确运行,感觉之前学文件打开那讲的时候没有需要编码呀,怎么这里就需要了呢?

还有,加上编码后,如果改到运行目录的上一级目录运行代码,又爆出错误
    for each_line in f:
File "C:\python37\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 23: invalid start byte

Zz_king 发表于 2021-3-25 17:14:25

如题如题T-T

西瓜味的苹果 发表于 2021-3-25 17:15:28

因为你文本文件当时存储的时候不是用utf8编码存储

Zz_king 发表于 2021-3-25 17:16:27

西瓜味的苹果 发表于 2021-3-25 17:15
因为你文本文件当时存储的时候不是用utf8编码存储

额。。。您是指的我第一个问题还是第二个呀

西瓜味的苹果 发表于 2021-3-25 17:23:41

等我研究研究哈

Zz_king 发表于 2021-3-25 17:35:13

西瓜味的苹果 发表于 2021-3-25 17:23
等我研究研究哈

好哒

西瓜味的苹果 发表于 2021-7-6 08:51:42

时隔多年我研究回来啦{:10_254:},我答应的话,回来实现
1.首先我们要明白计算机是二进制存储的,也就是説只有0和1,刚开始美国人用7比特表示字符,2的7次就是128,说明只能表示128个字符(具体发展历史百度,或者加我qq)

2.后来全世界的国家都有了电脑,于是世界出现两个团体立志收集全世界所有的字符,就这样,Unicode码表出现了,他采用4个字节,一个字节8比特,也就是32比特表示一个字符,
记住在这里是unicode码表,也就是他规定了什么样的比特组合代表什么字符,是一张对照表,不是编码格式

3.此时如果直接用unicode编码的格式直接编码(这里是编码格式),那么出现一个问题,如果一个文本全是英文,他有效的站位就只有8比特,前面三个字节全是0,这样太浪费空间了,
就比如a->00000000 00000000 00000000 00110010,你看前面3个字节不就浪费了

4.于是后来出现了utf8编码,他是动态编码的,英文编码为1字节,中文编码为3字节,怎么动态编码的查百度

5.现在我们来看python在内存中的形式是unicode码,那你想如果你的文本是用改变gb2312编码为字节的,那么如果要解码总不能用utf8去解码对吧

6.文字打字很累,有些东西说不清,有些抱歉

Zz_king 发表于 2021-7-7 19:13:01

西瓜味的苹果 发表于 2021-7-6 08:51
时隔多年我研究回来啦,我答应的话,回来实现
1.首先我们要明白计算机是二进制存储的,也就是説 ...

谢谢大佬{:10_254:}{:10_254:}{:10_254:},居然还真的回归了,肥肠感谢!{:10_250:}

西瓜味的苹果 发表于 2021-7-8 11:08:40

Zz_king 发表于 2021-7-7 19:13
谢谢大佬,居然还真的回归了,肥肠感谢!

可能接下来有点多余,但是我还是想给你举个例子,以帮助你更好的理解一下,{:10_257:},不要嫌我烦{:10_291:}
1.假设现在我们新建一个文本文档,里面打印出来两个字(“你好”),那么对照unicode表,你会得到他的16进制是:4F60 597D,百度有进制转换,你可以看看
2.此时这两个字在内存中对不对,在内存中形式就是(4F60 597D的二进制排列)
3.现在你想要把文本保存在硬盘中,于是你点击保存,这时就出现了一个问题,究竟要选择什么编码方式进行编码,也就是你想要什么样的二进制顺序存在硬盘中
4.假设我们选择gb2312编码(很多人选gbk,这个是gb2312的扩展,gb2312是标准),进行gb2312编码会变成-->\xc4\xe3\xba\xc3,\x表示这时16进制字符
5.假设时间回溯,我们选择utf8,进行utf8编码会变成-->\xe4\xbd\xa0\xe5\xa5\xbd,还记得我说的吗,utf8编码,中文会被编译为3个字节,
6。好我们把两个编码好的字节拿过来看:
gb2312---->\xc4\xe3\xba\xc3
utf-8-------->\xe4\xbd\xa0\xe5\xa5\xbd
你发现了什么,不同的编码对应的二进制是不一样的,比如gb2312编码的用utf8解码,他就会把\xc4\xe3\xba当成是中文编码过来的,还剩下一个\xc3你让程序咋办,让他不要了可能吗?不可能,所以你才会看到程序提示“无效的字节序列”,而且就这三个还是错误的字节码,根本解码不过来
7.这里面你需要了解utf8的编码过程,你就会明白为什么程序会认识这是中文编码过来的还是英文还是其他。
8.我感觉我人也太好了{:10_284:}
页: [1]
查看完整版本: 求助各位大佬!!!!《零基础入门学习python》,第30讲的作业4的代码,运行出现问题