【问题标题】:How does the string formatting % in python works with unicodes?python 中的字符串格式 % 如何与 unicode 一起使用?
【发布时间】:2017-02-15 00:38:22
【问题描述】:

我有一个关于 unicode 和 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 确实对我有用,对他们来说中断了……

【问题讨论】:

标签: python string unicode formatting


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答,但在情况 2 和 4 中,为什么 '%s' 可以使用该编解码器转换为 Unicode?你能解释一下后台发生了什么吗?
  • @R.Kayze % 和 s 是 ASCII 字符,ü 不是。如果一个字符不是被解码的字符集的成员,它就不能被转换为 Unicode。
  • 再次感谢,我想我理解了案例 2-4。但是为什么变音符号 'ü' 在案例 1 中起作用?我正在使用 python 2.7,如果 s 是 ASCII 字符而 ü 不是,那么 s 只需要一个字节,而 ü 两个。
  • @R.Kayze 在情况 1 中,字符串只是字节。任何一个字符串都不会强制使用 Unicode,因此不会出现 UnicodeDecodeError。字节只是按原样插入到格式字符串中,不管它们是什么。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 2016-11-07
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2012-04-21
  • 2021-10-06
相关资源
最近更新 更多