python中的字符串格式%如何与Unicode一起工作?

python中的字符串格式%如何与Unicode一起工作?,python,string,unicode,formatting,Python,String,Unicode,Formatting,我对python中的Unicode和字符串格式%有一个问题。我有以下四个案例: 案例: # -*- encoding: utf -*- print '%s' % 'München' # -*- encoding: utf -*- print '%s' % u'München' # -*- encoding: utf -*- print u'%s' % u'München' # -*- encoding: utf -*- print u'%s' % 'München' 案例: # -*-

我对python中的Unicode和字符串格式%有一个问题。我有以下四个案例:

  • 案例:

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

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

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

    # -*- encoding: utf -*-
    print '%s' % 'München'
    
    # -*- encoding: utf -*-
    print '%s' % u'München'
    
    # -*- encoding: utf -*-
    print u'%s' % u'München'
    
    # -*- 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失败

    我知道如何解决我的问题,但我想知道为什么会发生这个问题,所以如果有人能帮助我,我会很高兴。谢谢

    附言:
    感谢您提供了指向可能重复项的链接,但遗憾的是,我的问题没有通过解决,因为在这里,他们没有使用unicode作为待格式化字符串。所以他们只处理案例1和案例2,而不处理案例4,尤其是案例2对我有效,对他们无效…

    在案例2和案例4中,使用默认的
    ascii
    编解码器将非Unicode字符串隐式强制为Unicode。在第2种情况下,'%s'可以使用该编解码器转换为Unicode,但在第4种情况下,
    'München'
    不能


    在案例1和案例3中,两者都是字节字符串或都是Unicode字符串,因此不需要强制执行。

    可能是重复:可能是重复的感谢您的回答,但在案例2和案例4中,为什么“%s”和“München”不能用该编解码器转换为Unicode?你能解释一下背景中发生了什么吗?@R.Kayze%和s是ASCII字符,而ü不是。如果某个字符不是正在解码的字符集的成员,则无法将其转换为Unicode。再次感谢,我想我理解了案例2-4。但是,为什么在案例1中umlaut’ü’起作用?我正在使用python 2.7,如果s是ASCII字符,而ü不是,那么s只需要一个字节和ü2。@R.Kayze在案例1中,字符串就是字节。这两个字符串都不强制使用Unicode,因此不可能出现UnicodeDecodeError。字节只是按原样插入到格式字符串中,不管它们是什么。