问问题
284 次
2 回答
8
您可以这样做,但不能作为单个角色。将文件视为字节。
每个 UTF-8 字符由 1 到 4 个字节组成。要读取文件末尾,请读取最后 4*n 个字节并开始查找字符边界。UTF-8 字符的第一个字节具有0
or的最高位模式,11
其间的所有其他字节都将具有该模式10
。只需向后搜索,直到计算出与模式匹配的正确数字。
with open('test.txt', 'rb') as f:
f.seek(-4, os.SEEK_END)
ch=f.read(4)
for i in range(3, -1, -1):
pattern = ord(ch[i]) & 0xc0
if pattern in (0x00, 0x40, 0xc0):
ch = ch[i:]
break
于 2013-09-17T23:30:29.403 回答
5
除非你从头开始,否则我认为没有办法知道字符边界是什么......
这不是真的。您可以在任何 UTF-8 块中找到开头:
- 如果给定字节中的第一位被设置,则它是多字节序列的一部分。
- 如果第二位也被设置,那么它就是这样一个序列的开始。
因此,序列中的第一个字节要么以“0”(单字节字符)或“11”(两个或多个字节中的第一个)开头。后续字节都以“10”开头。
在 Wikipedia 上查看此图表。
因此,您只需从文件末尾读取几个字节即可确定字符的开始和结束位置。
于 2013-09-17T23:29:59.510 回答