latin 1编码对应于前256个utf8字符。换句话说,如果c是一个Unicode字符,其代码为[0-255],则c.encode('latin1')与ord(c)具有相同的值。 因此,要测试一个字符串是否至少有一个字符在[0-255]范围之外,只需尝试将其编码为latin1。如果它不包含任何字符,则编码将成功,否则您将获得UnicodeEncodeError:
nonAcceptibleUTF8Chars = list(chr(i) for i in range(161, 255 + 1))
result = re.sub('[' + re.escape(''.join(nonAcceptibleUTF8Chars)) + ']', '', inputString)
5条答案
按热度按时间nue99wik1#
ecfdbz9o2#
你所说的“特殊utf-8字符”到底是什么意思?
如果你的意思是每一个非ascii字符,那么你可以尝试:
s.encode('ascii', 'strict')
如果字符串不是100%ascii,则会出现UnicodeDecodeError
k5ifujac3#
latin 1编码对应于前256个utf8字符。换句话说,如果
c
是一个Unicode字符,其代码为[0-255]
,则c.encode('latin1')
与ord(c)
具有相同的值。因此,要测试一个字符串是否至少有一个字符在[0-255]范围之外,只需尝试将其编码为
latin1
。如果它不包含任何字符,则编码将成功,否则您将获得UnicodeEncodeError:顺便说一句,正如你在注解中被告知的那样,[0-255]范围之外的Unicode字符不是 * 特殊 *,只是它们不在latin 1范围内。
请注意,上面的代码也接受所有控制字符,如
\t
,\r
或\n
,因为它们是法律的的拉丁字符。它可能是或不是你想要的。xdyibdwo4#
可以使用正则表达式。
[^\u0021-\u00FF]
定义了一个字符集,表示任何一个不在\u0021
到\u00FF
范围内的字符。'[\u0021-\u00FF]'
之前的字母r
表示原始字符串表示法,它节省了大量反斜杠('')的转义工作。如果没有它,正则表达式中的每个反斜杠都必须以另一个反斜杠作为前缀来转义它。regexp.search(r'[\u0021-\u00FF]',s)
将扫描s
,查找正则表达式r'[^\u0021-\u00FF]'
产生匹配的第一个位置,并返回相应的匹配对象。如果没有找到匹配,则返回None
。filter()
将过滤掉不需要的字符串。这个答案只对Python 3有效
thigvfpy5#
下面的代码片段对我很有用(在python3中使用Regex):
输入字符串=维多利亚的秘密
结果=维多利亚秘密
虽然迟到了,希望这对你有帮助!:)