这答案能解释下吗
还是视频中的那个演示文件(record.txt),请问为何f.seek(45,0)不会报错,但是f.seek(46)就出错了呢?答:因为使用f. seek()定位的文件指针是按字节为单位进行计算的,演示文件(record. txt)是以GBK进行编码的,按照规则,一个汉字需要两个字节,f. seek(45)的位置位于字符“小”的开始位置,因此可以正常打印,而f.seek(46)的位置刚好位于字符“小”的中间位置,因此按照GBK的编码规则将无法将其解码!
你的答案不是告诉你了吗?…
一个汉字需要俩字节才能解码,也就是说,假如你只有一个汉字,你需要seek(2)才能解码。
seek(1)的话,由于汉字是个整体,是分开不了的,所以会报错。 你的理解是对的。
GBK汉字编码是两个字节,这样从一个汉字中间读取是会出现解码错误的。
utf-8汉字编码是三个字节,也会有这样的问题。
所以一般不建议用seek移动光标到文件的中间位置,seek更多是用在移动光标到文件开始或文件末尾。 本帖最后由 Twilight6 于 2020-7-14 16:01 编辑
答案解释的很清楚了哈
gbk 编码的汉字是以 两个字节来编码的,而当你设置 seek 为 45 时候 刚好光标就在小字的前面(这边用 l 模拟文件指针)
l小
当要读取 小 这个字要读取两个字节 也就是当光标移动到小字后面:
小l
这个时候光标的位置在 47了
而你读取的时候 读取 46 所以会导致你读取 小 这个字符的一半字节,所以解码错误导致报错
因为以 gbk 编码这个 小 字 是由两个字节组成的,你只解码一个字节就会报错
页:
[1]