UTF-8 и китайские иероглифы

У меня есть функция, которая вызывает API Google:

def get_lat_long(place):
    place = re.sub('\s','+', str(place), flags=re.UNICODE)
    url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + place
    content = urllib2.urlopen(url).read()

    obj = json.loads(content)
    results = obj['results']

    lat = long = None
    if len(results) > 0:
        loc = results[0]['geometry']['location']
        lat = float(loc['lat'])
        long = float(loc['lng'])

    return [lat, long]

Однако, когда я ввожу 師大附中 в качестве параметра, я получаю сообщение об ошибке:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 

Я пытался сделать str(place).encode('utf-8'), но не думаю, что это проблема. Я думаю, это потому, что функция не может читать китайские иероглифы, поэтому ей нужно сначала преобразовать китайские иероглифы в строку юникода, прежде чем она ее прочитает? Хотя это всего лишь предположение.


person jason adams    schedule 04.10.2014    source источник
comment
1. Какая версия Python? 2. В какой строке возникает ошибка? Можете ли вы обрезать свой пример только до этой строки? 3. str(place).encode('utf-8') не имеет особого смысла, str сам выполняет кодирование/декодирование   -  person Karol S    schedule 04.10.2014
comment
Моя версия Python 2.7. и строка, в которой я получаю ошибку, — это вторая строка фрагмента, который я разместил.   -  person jason adams    schedule 04.10.2014
comment
Какой тип place? unicode?   -  person Karol S    schedule 05.10.2014


Ответы (1)


Предполагая, что place имеет тип unicode, вам нужно сделать что-то вроде этого:

def get_lat_long(place):
    place = urllib.quote_plus(place.encode('utf-8'))
    url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + place
person Karol S    schedule 04.10.2014