4

我有这个字符串Traor\u0102\u0160

Traor\u0102\u0160应该生产Traoré。然后Traoréutf-8 解码应该产生Traorè

我怎样才能将其转换为Traorè

什么样的字符是Traor\u0102\u0160?统一码?

我已经多次阅读此http://docs.python.org/howto/unicode.html#encodings 。但我仍然很困惑。

我通过以下请求获得此数据:

import json
import requests

# making a request to get this json
r = requests.get('http://cdn.content.easports.com/fifa/fltOnlineAssets/2013/fut/items/web/199074.json')
print r.json

解决方案

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import json
import requests

headers = {'Content-Type': 'application/json'}

r = requests.get('http://cdn.content.easports.com/fifa/fltOnlineAssets/2013/fut/items/web/199074.json', headers=headers)


print r.content

#prints
{"Item":{"FirstName":"Lacina","LastName":"Traoré","CommonName":null,"Height":"203","DateOfBirth":{"Year":"1990","Month":"8","Day":"20"},"PreferredFoot":"Left","ClubId":"100766","LeagueId":"67","NationId":"108","Rating":"78","Attribute1":"79","Attribute2":"71","Attribute3":"45","Attribute4":"69","Attribute5":"50","Attribute6":"72","Rare":"1","ItemType":"PlayerA"}}

基本上我需要设置发送正确的标题。

谢谢你们

4

3 回答 3

7

您需要告诉请求期望什么编码

>>> import requests
>>> r = requests.get(url)
>>> r.encoding = 'UTF-8'
>>> r.json[u'Item'][u'LastName']
u'Traor\xe9'

否则,你会得到这个:

>>> r = requests.get(url)
>>> r.json['Item']['LastName']
u'Traor\u0102\u0160'
于 2012-10-25T13:42:59.767 回答
4

您遇到了一个错误requests;当服务器未设置显式编码时,requests用于chardet对编码进行有根据的猜测。

在这种特殊情况下,它会出错。chardet认为它是ISO-8859-2而不是UTF-8。该问题已报告给问题 765requests的维护者。

维护人员关闭了该问题,将问题归咎于服务器没有为响应设置字符编码。解决方法是r.encoding = 'utf-8'在访问之前进行设置,r.json以便内容正确解码而无需猜测。

但是,正如JF Sebastian 正确指出的那样,如果响应确实JSON,那么编码必须是 UTF 系列编码之一。JSON RFC甚至包括一个关于如何检测所使用的编码的部分。

我已经向执行此操作的项目提交了拉取请求requests;如果您要求 JSON 解码响应,并且没有设置编码,它将检测使用的正确 UTF 编码而不是猜测。

安装此补丁后,无需显式设置编码即可加载 URL:

>>> import requests
>>> r = requests.get('http://cdn.content.easports.com/fifa/fltOnlineAssets/2013/fut/items/web/199074.json')
>>> r.json[u'Item'][u'LastName']
u'Traor\xe9'
>>> print r.json[u'Item'][u'LastName']
Traoré
于 2012-10-25T16:09:50.263 回答
3

对我来说,您的网站返回"Traor\u00e9"最后一个字符是é):

r = requests.get(url)
print(json.dumps(json.loads(r.content)['Item']['LastName']))
# -> "Traor\u00e9" -> Traoré

r.json( r.text) 在这里产生不正确的内容。服务器或requests两者都使用不正确的编码,导致"Traor\u0102\u0160". JSON 文本的编码完全由其内容定义,因此无论服务器发送什么标头,都可以从json rfc对其进行解码:

JSON 文本应以 Unicode 编码。默认编码为
UTF-8。

由于 JSON 文本的前两个字符始终是 ASCII 字符 [RFC0020],因此可以确定八位字节
流是 UTF-8、UTF-16(BE 或 LE)还是 UTF-32(BE 或 LE)通过查看
前四个八位字节中的空值模式。

       00 00 00 xx  UTF-32BE
       00 xx 00 xx  UTF-16BE
       xx 00 00 00  UTF-32LE
       xx 00 xx 00  UTF-16LE
       xx xx xx xx  UTF-8

在这种情况下,开始时没有零字节,r.content否则json.loads如果服务器在Content-Type标头中发送不正确的字符编码或解决requests错误,您需要手动将其转换为 Unicode 字符串

于 2012-10-25T12:52:14.500 回答