我想检查一个字符串是否是ASCII格式的。

我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。

还有别的办法吗?


当前回答

当我试图确定如何使用/编码/解码一个我不确定编码的字符串(以及如何转义/转换该字符串中的特殊字符)时,我发现了这个问题。

我的第一步应该是检查字符串的类型-我没有意识到我可以从类型中获得关于其格式的良好数据。这个回答很有帮助,并触及了我问题的真正根源。

如果你得到一个粗鲁而执着的

“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')
'àéç'

其他回答

您可以使用正则表达式库,它接受Posix标准[[:ASCII:]]定义。

我觉得你问的问题不对

python中的字符串没有对应于'ascii'、utf-8或任何其他编码的属性。字符串的来源(无论是从文件读取,还是从键盘输入,等等)可能已经用ascii编码了一个unicode字符串来生成字符串,但这是您需要去寻找答案的地方。

也许你会问:“这个字符串是用ascii编码unicode字符串的结果吗?”——这个你可以回答 通过:

try:
    mystring.decode('ascii')
except UnicodeDecodeError:
    print "it was not a ascii-encoded unicode string"
else:
    print "It may have been an ascii-encoded unicode string"

就像@RogerDahl的回答一样,但是通过否定字符类和使用搜索而不是find_all或match来短路更有效。

>>> import re
>>> re.search('[^\x00-\x7F]', 'Did you catch that \x00?') is not None
False
>>> re.search('[^\x00-\x7F]', 'Did you catch that \xFF?') is not None
True

我想正则表达式对此进行了很好的优化。

最近遇到了类似的事情,供以后参考

import chardet

encoding = chardet.detect(string)
if encoding['encoding'] == 'ascii':
    print 'string is in ascii'

你可以用在:

string_ascii = string.decode(encoding['encoding']).encode('ascii')

Python中的sting (str-type)是一系列字节。仅仅通过查看字符串无法判断这一系列字节是否代表ascii字符串、像ISO-8859-1这样的8位字符集的字符串,还是用UTF-8或UTF-16或其他编码的字符串。

但是,如果您知道使用的编码,那么您可以将str解码为unicode字符串,然后使用正则表达式(或循环)检查它是否包含您所关心的范围之外的字符。