Как проверить, является ли строка unicode или ascii?

Что мне нужно сделать в Python, чтобы выяснить, какая кодировка?

9 Solutions collect form web for “Как проверить, является ли строка unicode или ascii?”

В Python 3 все строки являются последовательностями символов Unicode. Существует тип bytes который содержит необработанные байты.

В Python 2 строка может быть типа str или типа unicode . Вы можете сказать, какой код использует код:

 def whatisthis(s): if isinstance(s, str): print "ordinary string" elif isinstance(s, unicode): print "unicode string" else: print "not a string" 

Просто делать

 type(s) 

Один скажет unicode , другой скажет str .

Вы можете обрабатывать их отдельно, используя isinstance , например

 if isinstance(s, str): print 's is a string object' elif isinstance(s, unicode): print 's is a unicode object' 

Или вы имеете в виду, что у вас есть str , и вы пытаетесь выяснить, закодирована ли она с использованием ASCII или UTF-8 или что-то еще?

В этом случае попробуйте следующее:

 s.decode('ascii') 

если он вызывает исключение, строка не является 100% ASCII.

В python 3.x все строки являются последовательностями символов Unicode. и выполнение проверки isinstance для str (что означает строку unicode по умолчанию) должно быть достаточным.

 isinstance(x, str) 

Что касается python 2.x, большинство людей, похоже, используют оператор if, который имеет две проверки. один для str и один для unicode.

Если вы хотите проверить, есть ли у вас объект «string-like» с одним из операторов, вы можете сделать следующее:

 isinstance(x, basestring) 

Unicode не является кодировкой – цитирует Кумара Макмиллана:

Если ASCII, UTF-8 и другие строки байтов являются «текстовыми» …

… тогда Unicode является «text-ness»;

это абстрактная форма текста

Прочитайте « Unicode» в «Питоне» Макмиллана , «Полностью демистифицированный разговор» от PyCon 2008, он объясняет многое намного лучше, чем большинство связанных ответов на «Переполнение стека».

Если ваш код должен быть совместим как с Python 2, так и с Python 3, вы не можете напрямую использовать такие вещи, как isinstance(s,bytes) или isinstance(s,unicode) не обертывая их в тесте try / except или python, потому что bytes не определены в Python 2, а unicode не определен в Python 3.

Есть некоторые уродливые обходные пути. Крайне уродливым является сравнение названия типа, а не сравнение самого типа. Вот пример:

 # convert bytes (python 3) or unicode (python 2) to str if str(type(s)) == "<class 'bytes'>": # only possible in Python 3 s = s.decode('ascii') # or s = str(s)[2:-1] elif str(type(s)) == "<type 'unicode'>": # only possible in Python 2 s = str(s) 

Возможно, немного менее уродливое обходное решение – проверить номер версии Python, например:

 if sys.version_info >= (3,0,0): # for Python 3 if isinstance(s, bytes): s = s.decode('ascii') # or s = str(s)[2:-1] else: # for Python 2 if isinstance(s, unicode): s = str(s) 

Они оба безобидны, и большую часть времени, вероятно, лучший способ.

использовать:

 import six if isinstance(obj, six. text_type) 

в шести библиотеках он представляет собой:

 if PY3: string_types = str, else: string_types = basestring, 

Обратите внимание, что на Python 3 это не очень справедливо сказать:

  • str s – UTFx для любого x (например, UTF8)

  • str s – Unicode

  • str s – упорядоченные коллекции символов Unicode

Тип str Python – это (обычно) последовательность кодов Unicode, некоторые из которых относятся к символам.


Даже на Python 3 не так просто ответить на этот вопрос, как вы могли себе представить.

Очевидным способом тестирования ASCII-совместимых строк является попытка кодирования:

 "Hello there!".encode("ascii") #>>> b'Hello there!' "Hello there... ☃!".encode("ascii") #>>> Traceback (most recent call last): #>>> File "", line 4, in <module> #>>> UnicodeEncodeError: 'ascii' codec can't encode character '\u2603' in position 15: ordinal not in range(128) 

Ошибка отличает случаи.

В Python 3 есть даже некоторые строки, которые содержат недопустимые коды кода Unicode:

 "Hello there!".encode("utf8") #>>> b'Hello there!' "\udcc3".encode("utf8") #>>> Traceback (most recent call last): #>>> File "", line 19, in <module> #>>> UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 0: surrogates not allowed 

Используется тот же метод для их отличия.

Вы можете использовать универсальный детектор кодирования , но имейте в виду, что он просто даст вам лучшее предположение, а не фактическую кодировку, потому что невозможно узнать кодировку строки «abc», например. Вам нужно будет получить информацию о кодировании в другом месте, например, для протокола HTTP для этого используется заголовок Content-Type.

Это может помочь кому-то другому, я начал тестировать строковый тип переменной s, но для моего приложения было более просто вернуть s как utf-8. Процесс, вызывающий return_utf, затем знает, с чем он имеет дело, и может обрабатывать строку соответствующим образом. Код не является нетронутым, но я намереваюсь, чтобы он был агностиком версии Python без проверки версии или импорта шести. Прокомментируйте с помощью улучшений пример кода ниже, чтобы помочь другим людям.

 def return_utf(s): if isinstance(s, str): return s.encode('utf-8') if isinstance(s, int): return str(s).encode('utf-8') if isinstance(s, float): return str(s).encode('utf-8') if isinstance(s, complex): return str(s).encode('utf-8') try: return s.encode('utf-8') except TypeError: try: return str(s).encode('utf-8') except AttributeError: return s except AttributeError: return s return s # assume it was already utf-8 
  • Файл CSV Python 3, предоставляющий UnicodeDecodeError: кодек «utf-8» не может декодировать ошибку байта при печати
  • Каков дурацкий способ преобразования некоторой строки (utf-8 или else) в простую ASCII-строку в python
  • Загрузка Python UTF-8 JSON
  • Операция печати python с utf-8 и nohup
  • PyQt4: символ, не содержащий ASCII, обнаруженный в строке trUtf8
  • UnicodeDecodeError Загрузка с помощью sqlalchemy
  • проблема с python ... при использовании linux>
  • Разделить строку unicode на 300 байтовых фрагментов без уничтожения символов
  • Python - лучший язык программирования в мире.