【问题标题】:Cloud9 Unicode Error - Import Sys Does Not WorkCloud9 Unicode 错误 - 导入系统不起作用
【发布时间】:2016-02-18 09:09:27
【问题描述】:

当我使用默认版本的 Python (2.7.6) 在 Cloud9 IDE 中运行我的 python 代码时运行以下代码时出现以下错误:

import urllib
artistValue = "Sigur Rós"
artistValueUrl = urllib.quote(artistValue)

SyntaxError: 第 2 行 /home/ubuntu/workspace/test.py 文件中的非 ASCII 字符“\xc3”,但未声明编码;详情见http://www.python.org/peps/pep-0263.html

我阅读以适应以下代码是一种解决方法。

import urllib
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
artistValue = "Sigur Rós"
artistValueUrl = urllib.quote(artistValue)

当我尝试这个时,一个红色的 x 弹出错误显示为:

模块 'sys' 没有 'setdefaultencoding' 成员"

如果我运行代码,我仍然会收到语法错误。

为什么会发生这种情况,我该怎么办?

编辑: 我还从所选答案中尝试了以下内容:

import urllib
print urllib.quote(u"Sigur Rós")

当我运行它时,我收到以下错误:

SyntaxError: 文件中的非 ASCII 字符 '\xc3' /home/ubuntu/workspace/test.py 在第 2 行,但没有声明编码; 详情见http://www.python.org/peps/pep-0263.html

【问题讨论】:

  • 抱歉,sys.setdefaultencoding('utf-8') 在 Cloud9 IDE 中不起作用;有关详细信息,请参阅the sys docs。无论如何,这不是一个好主意,请参阅Dangers of sys.setdefaultencoding('utf-8') 了解信息。请发布您的代码(在代码块中)和您尝试读取的数据示例(也在代码块中),以便我们帮助您解决问题。还要提及您使用的 Python 版本,因为 Python 2 和 Python 3 处理 Unicode 的方式不同。
  • 感谢您的反馈。我已尽力编辑您上面推荐的内容。你有什么建议吗?

标签: python unicode cloud9-ide python-unicode


【解决方案1】:

好吧,这有点奇怪。如果您在脚本开头没有declare an encoding,Python 解释器应该给出SyntaxError 抱怨源代码中的非ASCII 字符; OTOH,如果您已经声明了编码(或 Cloud9 自动声明),那么 Python 解释器应该将其视为 UTF-8 编码字符串。

我不熟悉 Cloud9,所以我不能保证这个 工作,但它应该工作。 :)

将您的字符串设为 Unicode 字符串(使用 u 字符串前缀),然后将其显式编码为 UTF-8:

import urllib

artistValue = u"Sigur Rós"
artistValueUrl = urllib.quote(artistValue.encode('utf-8'))
print artistValueUrl

输出

Sigur%20R%C3%B3s

编辑

如果你运行这个会发生什么:

# -*- coding: utf-8 -*-
import urllib
print urllib.quote("Sigur Rós")

以下应该有效。当然,这不是在脚本中输入此类字符串的实用方法,我只是想了解 Cloud9 正在做什么。

import urllib
print urllib.quote("Sigur R\xc3\xb3s")

我想你也可以试试这个,这样我们就可以看到它产生了什么错误消息:

import urllib
print urllib.quote(u"Sigur Rós")

【讨论】:

  • @JasonMeloHall:这太奇怪了!仅当您将 Unicode 字符串传递给 urllib.quote 时,才会产生该错误消息,如果您传递 UTF-8 编码字符串,则不会发生该错误消息。我添加了一些其他的东西来尝试我的答案。请将错误消息粘贴到您的问题中,因为它们很难在 cmets 中阅读。
  • 在你的第二个答案中显式写入 unicode 字符是诀窍!非常感谢。
  • 如果它来自手动输入以外的其他东西,你有什么想法可以自动化这个吗?我应该为此开始另一个问题吗?
  • @JasonMeloHall:处理外部数据与处理文字字符串(即,作为脚本源代码的一部分的字符串)略有不同。如果数据已经以 UTF-8 编码,则只需将其传递给urllib.quote()。否则,您需要知道编码是什么,以便将数据字节正确解码为 Unicode,然后将该 Unicode 编码为 UTF-8 字节,然后在 UTF-8 字节上调用 urllib.quote()
  • @JasonMeloHall:我很高兴第二个答案(编辑后)有效,但我很好奇第一个和第三个答案(编辑后)给出的结果/错误消息;我希望第三个给出“UnicodeWarning:Unicode 相等比较失败......”消息。 FWIW,我通过 s=u"Sigur Rós";print repr(s.encode('utf8')) 在第二个答案中创建了该字符串,因此令人困惑的是 UTF-8 编码对您来说无法正常工作。
猜你喜欢
  • 1970-01-01
  • 2017-02-23
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多