2
4

2 回答 2

8

您可以这样做,但不能作为单个角色。将文件视为字节。

每个 UTF-8 字符由 1 到 4 个字节组成。要读取文件末尾,请读取最后 4*n 个字节并开始查找字符边界。UTF-8 字符的第一个字节具有0or的最高位模式,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 回答