addresse1 = unicodedata.normalize ('NFKD', addresse1) .encode ('utf-8', 'ignorieren')
Sie wahrscheinlichgemeint, um Nicht-ASCII-Zeichen zu entfernen. UTF-8 enthält alle Zeichen, so dass die Kodierung davon nicht entfernt wird, und ein Kodier-Dekodier-Zyklus mit ihm ist ein No-Op.
Gibt es eine bessere Lösung?
Es hängt davon ab, was Sie zu tun versuchen.
Wenn Sie nur diakritische Zeichen entfernen möchten, und nicht alle anderen Nicht-ASCII-Zeichen verlieren, könnten Sie unicodedata.category
für jedes Zeichen nach NFKD normalisiere lesen und jene der Klasse M.
entfernen Wenn Sie transkribieren wollen ASCII, das zu einer sprachspezifischen Frage wird, die eine benutzerdefinierte Ersetzung erfordert (z. B. in Deutsch ö
wird oe
, aber nicht auf Schwedisch).
Wenn Sie nur eine Zeichenfolge in ASCII fudgen möchten, weil das Nicht-ASCII-Zeichen zum Brechen von Code führt, ist es natürlich besser, diesen Code so zu korrigieren, dass er mit allen Unicode-Zeichen ordnungsgemäß funktioniert . Der Buchstabe è
ist in ASCII nicht codierbar, aber auch nicht 99.9989% aller Charaktere, so dass es kaum "besonders" ist. Code, der nur ASCII unterstützt, ist lahm.
Die Google Geocoding-API kann sehr gut mit Unicode arbeiten, daher gibt es keinen offensichtlichen Grund, warum Sie dies tun sollten.
ETA:
url2= 'maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 ...
Ah, Sie müssen alle Daten URL-kodieren Sie in eine URL zu injizieren. Das ist nicht nur für Unicode - das obige wird für viele ASCII Interpunktionszeichen auch brechen. Verwenden Sie urllib.quote
einen einzelnen String zu kodieren, oder urllib.encode
, um mehrere Parameter zu konvertieren:
params = dict(
address=address1.encode('utf-8'),
key=googlekey
)
url2 = '...?' + urllib.urlencode(params)
(in Python 3 ist es urllib.parse.quote
und urllib.parse.encode
und sie automatisch wählen UTF-8, so dass Sie nicht manuell dort codieren müssen.)
json.loads
liest Byte-Strings, so dass Sie sicher sein sollten, die UTF-8-Decodierung wegzulassen. Auf jeden Fall wird json.load
direkt aus einer Datei-ähnliches Objekt lesen, so sollten Sie die Daten nicht in einen String laden müssen überhaupt:
data3 = json.load(urllib.request.urlopen(url2))
[Pragmatische Unicode] (http://nedbatchelder.com/text/unipain/ unipain.html # 1) und [Das absolute Minimum, das jeder Softwareentwickler unbedingt, unbedingt über Unicode und Zeichensätze wissen muß] (http://www.joelonsoftware.com/articles/Unicode.html) kann nützlich sein, um das Verständnis zu verstehen was "encode" und "decode" tun (und warum sie nicht das sind, was Sie hier wollen). Im Allgemeinen vorausgesetzt, Sie verwenden eine Codierung, die jedes Zeichen in Ihrer Zeichenfolge darstellen kann, sollten Sie * erwarten * 'mystring.encode (my_encoding) .decode (my_encoding) == mystring'. – lvc
Die bessere Lösung besteht darin, Ihr Programm so zu korrigieren, dass es Unicode korrekt verarbeitet. Daten wegwerfen, mit denen man nicht umgehen kann, ist nie eine gute Lösung. :) So _please_ werfen Sie einen guten Blick auf lvc Links. –