第五季 发表于 2020-7-14 15:48:39

这答案能解释下吗

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

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

heidern0612 发表于 2020-7-14 15:54:37

你的答案不是告诉你了吗?…

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

seek(1)的话,由于汉字是个整体,是分开不了的,所以会报错。

sunrise085 发表于 2020-7-14 15:57:45

你的理解是对的。
GBK汉字编码是两个字节,这样从一个汉字中间读取是会出现解码错误的。
utf-8汉字编码是三个字节,也会有这样的问题。
所以一般不建议用seek移动光标到文件的中间位置,seek更多是用在移动光标到文件开始或文件末尾。

Twilight6 发表于 2020-7-14 15:59:45

本帖最后由 Twilight6 于 2020-7-14 16:01 编辑



答案解释的很清楚了哈

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

l小

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

小l

这个时候光标的位置在 47了

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

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


页: [1]
查看完整版本: 这答案能解释下吗