【问题标题】:Can't get a degree symbol into raw_input无法将度数符号放入 raw_input
【发布时间】:2015-03-30 12:37:08
【问题描述】:

我的代码中的问题如下所示:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

deg = u'°'
print deg
print '40%s N, 100%s W' % (deg, deg)
codelim = raw_input('40%s N, 100%s W)? ' % (deg, deg))

我正在尝试为纬度/经度字符串中的分隔符生成 raw_input 提示,并且提示应该包含此类字符串的示例。 print degprint '40%s N, 100%s W' % (deg, deg) 都可以正常工作——它们分别返回“°”和“40° N,100° W”——但 raw_input 步骤每次都失败。我得到的错误如下:

Traceback (most recent call last):
  File "C:\Users\[rest of the path]\scratch.py", line 5, in  <module>
    x = raw_input(' %s W")? ' % (deg))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 1:
ordinal not in range(128)

我想我会按照here 的指示通过添加编码标头来解决问题(实际上确实可以打印学位符号),但我仍然会尽快收到 Unicode 错误因为我向raw_input 添加了一个安全字符串。这是怎么回事?

【问题讨论】:

    标签: python python-2.7 character-encoding python-unicode


    【解决方案1】:

    在将提示字符串传递给原始输入之前,尝试将提示字符串编码为stdouts 编码

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import sys
    
    deg = u'°'
    
    prompt = u'40%s N, 100%s W)? ' % (deg, deg)
    codelim = raw_input(prompt.encode(sys.stdout.encoding))
    

    北纬 40°,西经 100°)?

    【讨论】:

    • 新手错误。哎呀。认为它已修复。
    • 现在要弄清楚它的为什么有效。嗯。这是很有教育意义的。谢谢!
    • 字符串是 unicode,但 raw_input 不期望 unicode(它可能期望 'utf-8'),所以它误解了传递给它的字节,你会得到垃圾。您可以获取 unicode 字符串并对其进行重新编码,sys.stdin.encoding 返回 stdin 用于该特定系统的编码,因此您的代码现在比硬编码 prompt.encode("utf-8")
    • 注意对答案的更正。它应该是 sys.stdout.encoding 而不是 sys.stdin.encoding。因为他们几乎肯定会返回相同的东西,所以它会很好,但现在它更准确了。
    • 啊哈,我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2020-12-29
    • 2017-08-01
    相关资源
    最近更新 更多