python3编码错误,混乱(使用twython)

时间:2013-09-04 01:51:32

标签: python utf-8 twython

这是我第一次在很长一段时间内尝试python。我试图使用twython简单地提取和打印推文到控制台。

tw = Twython(APP_KEY, access_token=access_token)
search = tw.search(q='#python')
for tweet in search["statuses"]:
    print(tweet['user']['name'])
    print(tweet['text'])

通常会打印一些推文然后我会遇到这个,同时打印用户名或推文文本(根据角色出现的位置而有所不同):

UnicodeEncodeError:'charmap'编解码器无法对字符'\ u2026'进行编码 139:字符映射到

我尝试添加.encode('utf-8')或将其包装在str()中,但我最接近的是b'text here',但显然我只想要推文。甚至尝试过decode()。我读到我必须告诉python我想要编码哪种字符集,我一直在做,但我仍然得到b'string here'。我在网上找到的很多例子都不适用于python3,这使得找到我需要的东西变得更加困难。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

您的控制台使用的字符集是什么?我认为这是ascii。 '\ u2026'是utf-8中的合法角色,但在ascii中是非法的。
 当你打印一个字符串时,python会尝试使用你的控制台的默认字符集对其进行编码,因为字符串在内部存储为unicode序列。如果默认字符集不支持字符串中的某些字符,则会遇到您遇到的错误 您可以将您的语言环境更改为utf-8并再次运行您的脚本,顺便说一句,unicode字符'\ u2026'显示为“...”。

答案 1 :(得分:0)

您可能会发现此页面在Twitter API处理字符计数的方式上使用UTF-8字符,这有助于解释为什么某些UTF-8字符在推文结束时起作用而其他字符不会:

https://dev.twitter.com/docs/counting-characters

关于实际问题,请在代码中插入以下client_args定义:

from twython import Twython

APP_KEY = "key"
APP_SECRET = "key-secret"
OAUTH_TOKEN = "token"
OAUTH_TOKEN_SECRET = "secret"

client_args = {
  "headers": {
    "accept-charset": "utf-8"
  }
}

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)

这应该告诉Twitter API接受应用程序中的UTF-8字符。然后,您只需要确保您的脚本/代码及其所有接口也接受UTF-8。然后你需要做的就是创建你在输入推文或DM并发送时所追求的角色。

如果上面的client_args设置没有与在shell和其他程序中指定您的字符集一起使用,则可能需要在传输的特定标头周围玩游戏。例如,您可能会发现“内容类型”是一个更好的标题来设置或需要包含它(尽管它不应该)。

我的大部分推文都是通过Emacs发送的(推特模式或在Emacs缓冲区内调用Twython脚本的shell)并且发送一系列UTF-8字符没有问题,直到Unicode 5.1或5.2,I认为

我实际上并不需要使用我的脚本设置自定义标头,但这是因为UTF-8是我对以下所有内容的默认字符集:Emacs,bash(shells),Firefox,Thunderbird,GPG(最后一个)不会影响Twitter,但总是值得鼓励使用),最后是Twitter API本身。如果我还没有将所有其他东西设置为默认使用UTF-8那么我几乎肯定会通过shell脚本和其他地方遇到麻烦。

最后,如果您发现大多数UTF-8字符都可以通过您的脚本发送,但某些(通常不太常见或相对较新)的字符不能,那么原因可能是由于您支持哪个版本的Unicode操作系统和/或可用的字符集(字体)。如果您遇到这个问题,那么您将遇到真正的麻烦,因为即使您设法将正确的角色传输到Twitter,您的计算机也无法显示它。另一方面,如果达到这一点,您至少会看到一些推文并且错误消息将会停止。

Python Requests文档和Twython文档提供了有关发送(POSTing)自定义标头格式的更多详细信息,Wikipedia包含标头类型列表。

WikiPedia列表在这里:

https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

不幸的是我的堆栈帐户最近才被激活,所以我无法链接所有有用的东西。您可能需要查看请求文档(查找“更复杂的POST请求”部分)和Twython文档(查找“操作请求标题,代理等”部分)。