将unicode字符串拆分为300个字节的块,而不会破坏字符

run*_*alk 9 python string utf-8

我想拆分u"an arbitrary unicode string"成300字节的块而不破坏任何字符.字符串将写入一个期望utf8使用的套接字unicode_string.encode("utf8").我不想破坏任何角色.我该怎么做?

Die*_*Epp 10

UTF-8就是为此而设计的.

def split_utf8(s, n):
    """Split UTF-8 s into chunks of maximum length n."""
    while len(s) > n:
        k = n
        while (ord(s[k]) & 0xc0) == 0x80:
            k -= 1
        yield s[:k]
        s = s[k:]
    yield s
Run Code Online (Sandbox Code Playgroud)

没有测试过.但是你找到了一个分裂的地方,然后回溯到你到达角色的开头.

但是,如果用户可能希望查看单个块,则可能需要拆分字形集群边界.这要复杂得多,但并不棘手.例如,"é"可能不希望拆分"e""´".或者你可能不在乎,只要他们最终再次陷入困境.


Jan*_*dec 5

UTF-8有一个特殊属性,所有连续字符都是0x80- 0xBF(从第10位开始).所以只要确保你没有在一个之前拆分.

有点像:

def split_utf8(s, n):
    if len(s) <= n:
        return s, None
    while ord(s[n]) >= 0x80 and ord(s[n]) < 0xc0:
        n -= 1
    return s[0:n], s[n:]
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.