我想检查一个字符串是否是ASCII格式的。
我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。
还有别的办法吗?
我想检查一个字符串是否是ASCII格式的。
我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。
还有别的办法吗?
当前回答
在Python 3中,我们可以将字符串编码为UTF-8,然后检查长度是否保持不变。如果是,那么原始字符串是ASCII。
def isascii(s):
"""Check if the characters in string s are in ASCII, U+0-U+7F."""
return len(s) == len(s.encode())
要检查,通过测试字符串:
>>> isascii("♥O◘♦♥O◘♦")
False
>>> isascii("Python")
True
其他回答
这样做怎么样?
import string
def isAscii(s):
for c in s:
if c not in string.ascii_letters:
return False
return True
Python 3.7新增功能(bpo32677)
不再对字符串进行烦人/低效的ascii检查,新的内置str/bytes/bytearray方法- .isascii()将检查字符串是否为ascii。
print("is this ascii?".isascii())
# True
为了防止代码崩溃,可能需要使用try-except来捕获TypeErrors
>>> ord("¶")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found
例如
def is_ascii(s):
try:
return all(ord(c) < 128 for c in s)
except TypeError:
return False
当我试图确定如何使用/编码/解码一个我不确定编码的字符串(以及如何转义/转换该字符串中的特殊字符)时,我发现了这个问题。
我的第一步应该是检查字符串的类型-我没有意识到我可以从类型中获得关于其格式的良好数据。这个回答很有帮助,并触及了我问题的真正根源。
如果你得到一个粗鲁而执着的
“ascii”编解码器无法解码263位置的0xc3字节:序号不在范围(128)
特别是当你正在进行ENCODING时,确保你没有尝试unicode()一个已经是unicode的字符串-由于某些可怕的原因,你会得到ascii编解码器错误。(请参阅Python厨房食谱和Python文档教程,以更好地了解这有多可怕。)
最终我决定我想做的是:
escaped_string = unicode(original_string.encode('ascii','xmlcharrefreplace'))
在调试中也有帮助的是在我的文件中设置默认编码为utf-8(把它放在你的python文件的开头):
# -*- coding: utf-8 -*-
这允许您测试特殊字符('àéç'),而不必使用它们的unicode转义(u'\xe0\xe9\xe7')。
>>> specials='àéç'
>>> specials.decode('latin-1').encode('ascii','xmlcharrefreplace')
'àéç'
def is_ascii(s):
return all(ord(c) < 128 for c in s)