Как определить, является ли строка escape-кодом unicode

Как определить, содержит ли строка .decode("unicode-escape") unicode, чтобы вы знали, нужно ли запускать .decode("unicode-escape") ?

Например:

test.py

 # -*- coding: utf-8 -*- str_escaped = '"A\u0026B"' str_unicode = '"Война́ и миръ"' arr_all_strings = [str_escaped, str_unicode] def is_escaped_unicode(str): #how do I determine if this is escaped unicode? pass for str in arr_all_strings: if is_escaped_unicode(str): str = str.decode("unicode-escape") print str 

Токовый выход:

 "A\u0026B" "Война́ и миръ" 

Ожидаемый результат:

 "A&B" "Война́ и миръ" 

Как определить is_escaped_unicode(str) чтобы определить, действительно ли строка, которая была передана, экранирована unicode?

3 Solutions collect form web for “Как определить, является ли строка escape-кодом unicode”

 str_escaped = u'"A\u0026B"' str_unicode = '"Война́ и миръ"' arr_all_strings = [str_escaped, str_unicode] def is_ascii(s): return all(ord(c) < 128 for c in s) def is_escaped_unicode(str): #how do I determine if this is escaped unicode? if is_ascii(str): # escaped unicode is ascii return True return False for str in arr_all_strings: if is_escaped_unicode(str): str = str.decode("unicode-escape") print str 

Следующий код будет работать для вашего дела.

Объясните:

  • Вся строка в str_escaped находится в диапазоне Ascii.

  • Char в str_unicode не содержится в диапазоне Ascii.

Ты не можешь.

Невозможно определить, был ли «A \ u0026B» изначально получен какой-то текст, который был закодирован, или данные являются просто байтами «A \ u0026B» или если мы пришли туда из какой-либо другой кодировки.

Как … вы знаете, нужно ли запускать .decode("unicode-escape")

Вы должны знать, вызвал ли кто-то ранее text.encode('unicode-escape') . Сами байты не могут сказать вам.

Вы, конечно, можете догадаться , ища escape-последовательности \ u или \ U, или просто попробуйте / за исключением декодирования и посмотрите, что произойдет, но я не рекомендую идти по этому маршруту.

Если вы столкнулись с байтом в своем приложении и вы еще не знаете, что такое кодировка, тогда ваша проблема лежит в другом месте и должна быть исправлена ​​в другом месте.

Вот грубый способ сделать это. Попробуйте декодировать как unicode-escape, и если это удастся, результирующая строка будет короче исходной строки.

 str_escaped = '"A\u0026B"' str_unicode = '"Война́ и миръ"' arr_all_strings = [str_escaped, str_unicode] def decoder(s): y = s.decode('unicode-escape') return y if len(y) < len(s) else s.decode('utf8') for s in arr_all_strings: print s, decoder(s) 

вывод

 "A\u0026B" "A&B" "Война и миръ" "Война и миръ" 

Но если серьезно, вы можете сэкономить много боли, если сможете перейти на Python 3. И если вы не можете сразу перейти на Python 3, вы можете найти эту статью полезной: Pragmatic Unicode , написанный ветеранкой SO Ned Batchelder ,

  • Удаление неанглийских слов из предложения в python
  • как разбить строку unicode на список
  • Как заменить символы Unicode символами ascii в Python (заданный perl-скрипт)?
  • Имена файлов Unicode в Windows с Python & subprocess.Popen ()
  • UnicodeError при использовании печати с кодировкой по умолчанию, установленной в ASCII
  • JSON как строка с unicode для действительного JSON
  • TypeError: принуждение к Unicode: нужна строка или буфер, обнаружен NoneType
  • SQLAlchemy и UnicodeDecodeError
  • Python - лучший язык программирования в мире.