我想检查一个字符串是否是ASCII格式.
我知道ord()
,但是当我尝试时ord('é')
,我有TypeError: ord() expected a character, but string of length 2 found
.我知道它是由我构建Python的方式引起的(如ord()
文档中所述).
还有其他方法可以检查吗?
我想你不是在问正确的问题 -
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"
def is_ascii(s): return all(ord(c) < 128 for c in s)
Python 3方式:
isascii = lambda s: len(s) == len(s.encode())
不再对字符串进行无聊/低效的ascii检查,新的内置str
/ bytes
/ bytearray
方法 - .isascii()
将检查字符串是否为ascii.
print("is this ascii?".isascii()) # True
最近变成这样的东西 - 供将来参考
import chardet encoding = chardet.detect(string) if encoding['encoding'] == 'ascii': print 'string is in ascii'
您可以使用:
string_ascii = string.decode(encoding['encoding']).encode('ascii')
Vincent Marchetti有正确的想法,但str.decode
已在Python 3中弃用.在Python 3中,您可以使用以下命令进行相同的测试str.encode
:
try: mystring.encode('ascii') except UnicodeEncodeError: pass # string is not ascii else: pass # string is ascii
请注意,您要捕获的异常也已更改UnicodeDecodeError
为UnicodeEncodeError
.
你的问题不正确; 你看到的错误不是你如何构建python的结果,而是字节字符串和unicode字符串之间的混淆.
字节串(例如,python语法中的"foo"或"bar")是八位字节的序列; 数字从0到255.Unicode字符串(例如u"foo"或u'bar')是unicode代码点的序列; 数字0-1112064.但是你似乎对角色é很感兴趣,它(在你的终端中)是一个代表单个字符的多字节序列.
而不是ord(u'é')
,试试这个:
>>> [ord(x) for x in u'é']
这告诉你哪个代码点序列"é"代表.它可能会给你[233],或者它可能会给你[101,770].
而不是chr()
扭转这种情况,有unichr()
:
>>> unichr(233) u'\xe9'
该字符实际上可以表示单个或多个unicode"代码点",它们本身代表字形或字符.它是"具有锐化重音的e(即代码点233)"或"e"(代码点101),接着是"对前一个字符的重音"(代码点770).所以这个完全相同的字符可以表示为Python数据结构u'e\u0301'
或u'\u00e9'
.
大多数情况下,您不必关心这一点,但如果您迭代unicode字符串,它可能会成为问题,因为迭代按代码点而不是可分解字符工作.换句话说,len(u'e\u0301') == 2
和len(u'\u00e9') == 1
.如果这对您很重要,您可以使用,在组合表格和分解表格之间进行转换unicodedata.normalize
.
通过指出每个特定术语如何引用文本表示的不同部分,Unicode术语表可以是理解其中一些问题的有用指南,这比许多程序员意识到的要复杂得多.
这样做怎么样?
import string def isAscii(s): for c in s: if c not in string.ascii_letters: return False return True
我在尝试确定如何使用/编码/解码其编码我不确定的字符串(以及如何转义/转换该字符串中的特殊字符)时发现了这个问题.
我的第一步应该是检查字符串的类型 - 我没有意识到我可以从类型获得关于其格式的良好数据. 这个答案非常有帮助,并找到了我的问题的真正根源.
如果你变得粗鲁和持久
UnicodeDecodeError:'ascii'编解码器无法解码位置263中的字节0xc3:序数不在范围内(128)
特别是当你在ENCODING时,确保你没有尝试unicode()一个已经是unicode的字符串 - 由于一些可怕的原因,你得到ascii编解码器错误.(另请参阅Python Kitchen配方和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') 'àéç'