是否有一种 Pythonic 方法可以将 Unicode 字符串截断为最大字节数?

Is there a Pythonic way of truncating a Unicode string by a maximum number of bytes?

如果 API 接受一些有字节数限制的字符串值,但接受 Unicode,是否有更好的方法来缩短具有有效 Unicode 的字符串?

def truncate(string: str, length: int):
    """Shorten an Unicode string to a certain length of bytes."""
    if len(string.encode()) <= length:
        return string

    chars = list(string)
    while sum(len(char.encode()) for char in chars) > length:
        chars.pop(-1)

    return "".join(chars)

这应该适用于 Python-3:

bytes_ = string.encode()
try:
    return bytes_[:length].decode()
except UnicodeDecodeError as err:
    return bytes_[:err.start].decode()

基本上我们在第一次解码时截断error.UTF-8是前缀码。因此,解码器应该始终能够看到字符串何时在字符中间被截断。口音和其他东西可能会出现奇怪的情况。我还没有想过这个。也许我们也需要一些标准化。

在Python-2中,确保指定编码。