这适用于 UTF8,如果你喜欢在正则表达式中这样做。
import re
partial="\xc2\x80\xc2\x80\xc2"
re.sub("([\xf6-\xf7][\x80-\xbf]{0,2}|[\xe0-\xef][\x80-\xbf]{0,1}|[\xc0-\xdf])$","",partial)
"\xc2\x80\xc2\x80"
它涵盖了从U+0080(2字节)到U+10FFFF(4字节)utf8字符串
就像UTF8 algorithm 一样,它真的很简单
从 U+0080 到 U+07FF 需要 2 个字节 110yyyxx 10xxxxxx
它的意思是,如果你最后只看到一个字节,比如 110yyyxx(0b11000000 到 0b11011111)
是[\xc0-\xdf],会偏一个。
从 U+0800 到 U+FFFF 需要 3 个字节 1110yyyy 10yyyyxx 10xxxxxx
如果最后只看到 1 或 2 个字节,那将是部分字节。
它将匹配这个模式[\xe0-\xef][\x80-\xbf]{0,1}
从 U+10000–U+10FFFF 需要 4 个字节 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx
如果最后只看到 1 到 3 个字节,那将是部分字节
它将匹配这个模式[\xf6-\xf7][\x80-\xbf]{0,2}
更新:
如果您只需要基本多语言平面,您可以删除最后一个模式。这样就可以了。
re.sub("([\xe0-\xef][\x80-\xbf]{0,1}|[\xc0-\xdf])$","",partial)
如果该正则表达式有任何问题,请告诉我。