2017-02-14 1 views
3

У меня вопрос о unicodes и форматировании строки% в python. У меня есть следующие четыре случая:Как форматирование строки% в python работает с юникодами?

  1. случай:

    # -*- encoding: utf -*- 
    print '%s' % 'München' 
    
  2. случай:

    # -*- encoding: utf -*- 
    print '%s' % u'München' 
    
  3. случай:

    # -*- encoding: utf -*- 
    print u'%s' % u'München' 
    
  4. случай:

    # -*- encoding: utf -*- 
    print u'%s' % 'München' 
    

Случаи 1-3 работают отлично, но в случае 4 я получаю ошибку:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128) 

Так что мои вопросы: почему случаи 1-3 работы (особенно случай 2) и почему случай 4 терпит неудачу?

Я знаю, как исправить свою проблему, но я хочу понять, почему эта проблема происходит, поэтому я был бы счастлив, если бы кто-то мог мне помочь. Благодаря!

PS: Спасибо за ссылки на возможные дубликаты, но, к сожалению, мои проблемы не решены Why does Python 2.x throw an exception with string formatting + unicode?, потому что в этом случае они не используют unicode для формируемой строки. Таким образом, они делают случаи 1 и 2, но не 4, и особенно случай 2 действительно работает для меня и ломается для них ...

+1

Возможно, обман: http://stackoverflow.com/questions/22537722/why-does-python-2-x-throw-an-exception-with-string-formatting-unicode?rq=1 – akkatracker

+1

Возможный дубликат [Почему Python 2.x генерирует исключение с форматированием строки + unicode?] (Http://stackoverflow.com/questions/22537722/why-does-python-2-x-throw-an-exception-with-string- форматирование-юникод) – Sayse

ответ

2

В случаях 2 и 4 строка, не относящаяся к Юникоду, принудительно применяется к Unicode, неявно используя значение по умолчанию ascii кодек. В случае, если 2 '%s' может быть преобразован в Unicode с этим кодеком, но в случае, если 4 'München' не может.

В случаях 1 и 3 оба являются байтовыми строками или оба являются строками Unicode, поэтому принуждение не требуется.

+0

Спасибо за ваш ответ, но в случае 2 и 4 почему «% s» и почему «München» не конвертируется в Unicode с этим кодеком? Не могли бы вы объяснить мне, что происходит в фоновом режиме? –

+0

@ R.Kayze% и s - символы ASCII, ü нет. Если символ не является членом декодируемого набора символов, его нельзя преобразовать в Юникод. –

+0

Еще раз спасибо, я думаю, что понял случаи 2-4. Но почему умляут «ü» работает в случае 1? Я работаю с python 2.7 и если s является символом ASCII, а ü не тогда, то ему нужен только один байт и ü два. –

Смежные вопросы