这适用于 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 算法一样
从U+0080 到 U+07FF需要 2 个字节 110yyyxx 10xxxxxx 它的意思,如果你看到最后只有一个字节像 110yyyxx (0b11000000 to 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)
让我知道该正则表达式是否有任何问题。