Я хочу проверить, есть ли строка в ASCII или нет.
Я знаю ord()
, однако, когда я пытаюсь ord('é')
, у меня есть TypeError: ord() expected a character, but string of length 2 found
. Я понял, что это вызвано тем, как я собирал Python (как объяснено в ord()
документации ).
Есть ли другой способ проверить?
Ответы:
источник
ord(c) < 128
бесконечно более читаемым и понятным , чемc <= "\x7F"
Я думаю, что вы не задаете правильный вопрос ...
Строка в python не имеет свойства, соответствующего 'ascii', utf-8 или любой другой кодировке. Источник вашей строки (независимо от того, читаете ли вы ее из файла, вводите с клавиатуры и т. Д.), Возможно, закодировал строку unicode в ascii, чтобы создать вашу строку, но вам нужно найти ответ.
Возможно, вы можете задать вопрос: «Является ли эта строка результатом кодирования строки Unicode в ascii?» - На это вы можете ответить, попробовав:
источник
str
в Python 2,bytes
в Python 3).str
в любой кодировке ISO необходимо сначала кодировать в Unicode. Ответ должен идти в этом.s.decode('ascii') if isinstance(s, bytes) else s.encode('ascii')
в Python 3. Ввод OP является байтовой строкой'é'
(синтаксис Python 2, Python 3 не был выпущен в то время) и, следовательно,.decode()
является правильным.str
на Python 2 это строка байтов. Правильно использовать,.decode('ascii')
чтобы узнать, все ли байты находятся в диапазоне ASCII.Python 3 way:
Чтобы проверить, передайте тестовую строку:
источник
isascii
, теперь есть функция, передающая строку:isascii('somestring')
==True
иisascii('àéç')
==False
try: s.encode('ascii'); return True
except UnicodeEncodeError: return False
(как и выше, но кодирование, так как строки в Юникоде в Python 3). Этот ответ также вызывает ошибку в Python 3, когда у вас есть суррогаты (например,isascii('\uD800')
False
Новое в Python 3.7 ( bpo32677 )
Нет более утомительным / неэффективные проверки ASCII на строках, новый встроенный
str
/bytes
/bytearray
метод -.isascii()
не будет проверять , если строки в ASCII.источник
"\x03".isascii()
тоже верно. Документация говорит, что это просто проверяет, что все символы находятся ниже кодовой точки 128 (0-127). Если вы хотите , чтобы избежать управляющих символов, вам нужно:text.isascii() and text.isprintable()
.isprintable
Недостаточно просто использовать само по себе, так как он будет считать, что символ типа ((правильно) печатается, но его нет в разделе печати для ascii, поэтому вам нужно проверить оба, если вы хотите оба. Еще одна ошибка: пробелы считаются печатными, а табуляции и переводы строк - нет.Недавно столкнулся с чем-то вроде этого - для дальнейшего использования
который вы могли бы использовать с:
источник
{'confidence': 0.99, 'encoding': 'EUC-JP'}
(что в данном случае было совершенно неверно)Винсент Маркетти имеет правильную идею, но
str.decode
устарел в Python 3. В Python 3 вы можете сделать тот же тест сstr.encode
:Обратите внимание, что исключение, которое вы хотите перехватить, также изменилось с
UnicodeDecodeError
наUnicodeEncodeError
.источник
bytes
введите в Python 3, у которого нет.encode()
метода)..decode()
в @Vincent Marchetti ответ правильный .'é'
был ли бистринг в то время.Ваш вопрос неверен; ошибка, которую вы видите, является не результатом того, как вы создали Python, а из-за путаницы между строками байтов и строками Unicode.
Строки байтов (например, «foo» или «bar» в синтаксисе Python) представляют собой последовательности октетов; цифры от 0 до 255. Строки Unicode (например, u "foo" или u'bar ') представляют собой последовательности кодовых точек Unicode; цифры от 0-1112064. Но вас, похоже, интересует символ é, который (в вашем терминале) является многобайтовой последовательностью, представляющей один символ.
Вместо этого
ord(u'é')
попробуйте это:Это говорит о том, какую последовательность кодовых точек представляет «é». Это может дать вам [233], или это может дать вам [101, 770].
Вместо того,
chr()
чтобы изменить это, естьunichr()
:Этот символ на самом деле может быть представлен как одной или несколькими «кодовыми точками» Юникода, которые сами представляют графемы или символы. Это либо «e с острым акцентом (т.е. кодовая точка 233)», либо «e» (кодовая точка 101), за которым следует «острый акцент на предыдущий символ» (кодовая точка 770). Так что этот точно такой же символ может быть представлен как структура данных Python
u'e\u0301'
илиu'\u00e9'
.Большую часть времени вам не нужно об этом беспокоиться, но это может стать проблемой, если вы перебираете строку в юникоде, поскольку итерация выполняется по коду, а не по разложимому символу. Другими словами,
len(u'e\u0301') == 2
иlen(u'\u00e9') == 1
. Если это важно для вас, вы можете конвертировать между составными и разложенными формами, используяunicodedata.normalize
.Глоссарий Unicode может быть полезным руководством для понимания некоторых из этих проблем, указывая, как каждый конкретный термин относится к другой части представления текста, что гораздо сложнее, чем понимают многие программисты.
источник
Как насчет этого?
источник
Я нашел этот вопрос, пытаясь определить, как использовать / кодировать / декодировать строку, в кодировке которой я не был уверен (и как экранировать / преобразовать специальные символы в этой строке).
Мой первый шаг должен был проверить тип строки - я не знал, что смогу получить хорошие данные о ее форматировании из типа (ов). Этот ответ был очень полезным и добрался до сути моих проблем.
Если вы получаете грубый и настойчивый
особенно, когда вы кодируете, убедитесь, что вы не пытаетесь unicode () строка, которая уже является Unicode - по какой-то ужасной причине вы получаете ошибки кодека ascii. (См. Также рецепт Python Kitchen и учебники по Python для лучшего понимания того, насколько это может быть ужасно.)
В конце концов я решил, что то, что я хотел сделать, это:
Также в отладке было полезно установить кодировку по умолчанию в моем файле на utf-8 (поместите это в начало вашего файла python):
Это позволяет вам тестировать специальные символы ('àéç'), не используя их экранированные символы Юникода (u '\ xe0 \ xe9 \ xe7').
источник
Чтобы улучшить решение Александра из Python 2.6 (и в Python 3.x), вы можете использовать вспомогательный модуль curses.ascii и функцию curses.ascii.isascii () или другие: https://docs.python.org/2.6/ библиотека / curses.ascii.html
источник
curses.ascii
Вы можете использовать библиотеку регулярных выражений, которая принимает стандартное определение Posix [[: ASCII:]].
источник
Sting (
str
-type) в Python представляет собой серию байтов. Там нет никакого способа , чтобы говорить просто смотреть на строки этой серии байтов , представляют ли строку ASCII, строку в 8-битной кодировке , как ISO-8859-1 или строки , зашифрованную с UTF-8 или UTF-16 или что - то ,Однако, если вы знаете используемую кодировку, то вы можете
decode
поместить str в строку Unicode, а затем использовать регулярное выражение (или цикл), чтобы проверить, содержит ли он символы вне диапазона, который вас беспокоит.источник
Как и ответ @ RogerDahl, но более эффективно закорачивать, отрицая класс символов и используя поиск вместо
find_all
илиmatch
.Я предполагаю, что регулярное выражение хорошо оптимизировано для этого.
источник
Чтобы включить пустую строку ASCII, изменить
+
к*
.источник
Чтобы ваш код от аварий, может быть , вы хотите использовать ,
try-except
чтобы пойматьTypeErrors
Например
источник
try
обертка совершенно бессмысленна. Если"¶"
это строка Unicode, тоord("¶")
будет работать, а если нет (Python 2),for c in s
будет разлагать ее на байты, поэтомуord
будет продолжать работать.Я использую следующее, чтобы определить, является ли строка ascii или unicode:
Затем просто используйте условный блок для определения функции:
источник
is_ascii(u'i am ascii')
. Даже если буквы и пробелы определенно являются ASCII, это все равно возвращается,False
потому что мы заставили строку бытьunicode
.