鱼C论坛

 找回密码
 立即注册
查看: 1956|回复: 1

028 作业不懂麻烦看看

[复制链接]
发表于 2021-2-16 16:08:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
8. 还是视频中的那个演示文件(record.txt),请问为何f.seek(45, 0)不会出错,但f.seek(46)就出错了呢?
>>> f.seek(46)
46
>>> f.readline()
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    f.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xe3 in position 4: illegal multibyte sequence
复制代码

答:因为使用f.seek()定位的文件指针是按字节为单位进行计算的,演示文件(record.txt)是以GBK进行编码的,按照规则,一个汉字需要占用两个字节,f.seek(45)的位置位于字符“小”的开始位置,因此可以正常打印,而f.seek(46)的位置刚好位于字符“小”的中间位置,因此按照GBK编码的形式无法将其解码!#两个红字部分是什么意思呢?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-16 16:24:29 | 显示全部楼层
本帖最后由 jackz007 于 2021-2-16 16:33 编辑

       对于 ASCII 码文件,每个字符就一个字节,可以随意 seek(),把指针挪到哪里就从那里直接读取就可以了,但是,中文字符不行,Windows 中文字符采用 GBK 编码,每个汉字占用 2 个字节,比如,"中国" 的 GBK 编码是 D6 D0 B9 FA,正好 4 个字节,其中,D6 D0 是 "中",B9 FA 是 "国",如果写入文件,那么,文件中对应于 "中国" 的内容,就是 4 个字节 D6 D0 B9 FA,这 4 个字节必须两两一组,不可分割。如果通过 seek() 把文件指针指向 D6 或 B9,那是可以正常读取并解码文件内容的,但是,如果把指针指向了 D0 或 FA 并进行读取,那么汉字编码就分家了,读到的中文编码就不能满足两两成对的要求,就无法对汉字进行正常解码,这就是出错的根本原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 13:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表