鱼C论坛

 找回密码
 立即注册
查看: 1422|回复: 3

[已解决]这答案能解释下吗

[复制链接]
发表于 2020-7-14 15:48:39 | 显示全部楼层 |阅读模式

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

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

x
还是视频中的那个演示文件(record.txt),请问为何f.seek(45,0)不会报错,但是f.seek(46)就出错了呢?

答:因为使用f. seek()定位的文件指针是按字节为单位进行计算的,演示文件(record. txt)是以GBK进行编码的,按照规则,一个汉字需要两个字节,f. seek(45)的位置位于字符“小”的开始位置,因此可以正常打印,而f.seek(46)的位置刚好位于字符“小”的中间位置,因此按照GBK的编码规则将无法将其解码!
最佳答案
2020-7-14 15:59:45
本帖最后由 Twilight6 于 2020-7-14 16:01 编辑



答案解释的很清楚了哈

gbk 编码的汉字是以 两个字节来编码的,而当你设置 seek 为 45 时候 刚好光标就在小字的前面(这边用 l 模拟文件指针)

l


当要读取 小 这个字要读取两个字节 也就是当光标移动到小字后面:

l


这个时候光标的位置在 47

而你读取的时候 读取 46 所以会导致你读取 小 这个字符的一半字节,所以解码错误导致报错

因为以 gbk 编码这个 小 字 是由两个字节组成的,你只解码一个字节就会报错


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

使用道具 举报

发表于 2020-7-14 15:54:37 | 显示全部楼层
你的答案不是告诉你了吗?…

一个汉字需要俩字节才能解码,也就是说,假如你只有一个汉字,你需要seek(2)才能解码。

seek(1)的话,由于汉字是个整体,是分开不了的,所以会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 15:57:45 | 显示全部楼层
你的理解是对的。
GBK汉字编码是两个字节,这样从一个汉字中间读取是会出现解码错误的。
utf-8汉字编码是三个字节,也会有这样的问题。
所以一般不建议用seek移动光标到文件的中间位置,seek更多是用在移动光标到文件开始或文件末尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 15:59:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-14 16:01 编辑



答案解释的很清楚了哈

gbk 编码的汉字是以 两个字节来编码的,而当你设置 seek 为 45 时候 刚好光标就在小字的前面(这边用 l 模拟文件指针)

l


当要读取 小 这个字要读取两个字节 也就是当光标移动到小字后面:

l


这个时候光标的位置在 47

而你读取的时候 读取 46 所以会导致你读取 小 这个字符的一半字节,所以解码错误导致报错

因为以 gbk 编码这个 小 字 是由两个字节组成的,你只解码一个字节就会报错


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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