В чем разница между префиксом u '' и unicode () в python?

В чем разница между префиксом u'' и unicode()

# -*- coding: utf-8 -*-
print u'上午'  # this works
print unicode('上午', errors='ignore') # this works but print out nothing
print unicode('上午') # error

Для третьего print ошибка показывает: UnicodeDecodeError: кодек ascii не может декодировать байт 0xe4 в позиции 0

Если у меня есть текстовый файл, содержащий символы, отличные от ascii, такие как «上午», как его прочитать и правильно распечатать?

10 голосов | спросил DehengYe 20 AM000000100000005231 2015, 10:17:52

4 ответа


0
  • u'..' является строковым литералом и декодирует символы в соответствии с объявлением кодировки источника.

  • unicode() - это функция, которая преобразует другой тип в unicode объект, вы дали ему строковый литерал . Он будет декодировать байтовую строку в соответствии с кодеком ASCII по умолчанию.

Итак, вы создали объект байтовой строки с использованием другого типа буквенной нотации, а затем попытались преобразовать его в объект unicode(), который не удается, потому что кодек по умолчанию для str -> unicode преобразования - это ASCII.

Два совершенно разных зверя. Если вы хотите использовать последний, вам нужно дать ему явный кодек:

print unicode('上午', 'utf8')

Они связаны так же, как и с использованием 0xFF и int('0xFF', 0) связаны между собой; первый определяет целое число со значением 255 с использованием шестнадцатеричной записи, второй использует функцию int() для извлечения целого числа из строки.

Альтернативным методом будет использование str.decode() метод :

print '上午'.decode('utf8')

Не поддавайтесь искушению использовать обработчик ошибок (например, ignore' или 'replace'), если вы не знаете, что делаете. 'ignore' особенно может маскировать основные проблемы, например, при выборе неправильного кодека.

Вы можете прочитать о Python и Unicode:

ответил Martijn Pieters 20 AM000000100000001931 2015, 10:21:19
0

Когда str не имеет префикса u'' в Python 2.7.x, что интерпретатор видит как строку байтов без явного кодирования.

Если вы не скажете интерпретатору, что делать с этими байтами при выполнении unicode(), он (как вы видели) по умолчанию будет пытается decode байты, которые он видит через схема кодировки ascii .

Это делается в качестве предварительного шага для попытки преобразования простых байтов str в unicode объект.

Использование ascii для decode : попробуйте интерпретировать каждый байт str, используя жестко закодированное отображение, число между 0 и 127.

Ошибка, с которой вы столкнулись, была похожа на dict KeyError: интерпретатор обнаружил байт, для которого схема кодирования ascii не имеет указанного отображения.

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

Вы можете изменить этот предварительный шаг, сказав интерпретатору decode байтов, используя вместо этого другой набор отображений кодирования /декодирования, который выходит за рамки ascii, такие как UTF-8, как описано в других ответах.

Если интерпретатор найдет отображение в выбранной схеме для каждого байта (или байтов) в str, он будет успешно декодирован, и интерпретатор будет использовать полученные сопоставления для создания объекта unicode.

Python unicode объект представляет собой серию Unicode кодовые точки . В кодовом пространстве есть 1 112 064 допустимых кодовых точек .

И если схема, которую вы выбираете для декодирования, является той, с которой был закодирован ваш текст (или кодовые точки), то вывод при печати должен быть идентичен исходному тексту.

Можно также попробовать Python 3. Соответствующая разница объясняется в первом комментарии ниже.

ответил scharfmn 20 AM000000100000002231 2015, 10:36:22
0

Юникод - это тип объекта, тогда как «u» - это литерал, используемый для обозначения того, что объект является объектом Юникода. Он похож на литерал 'L', используемый для обозначения long int.

ответил hspandher 20 AM000000100000001531 2015, 10:24:15
0

Пожалуйста, попробуйте: '上午' .decode ('utf8', 'ignore'). encode ('utf8')

ответил futurelj 20 AM000000100000002831 2015, 10:33:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132