UnicodeEncodeError al analizar el nombre del mes con el tiempo de ejecución de Python

Tengo que analizar una fecha alemana en formato MES AÑO, donde MES es el nombre completo del mes. Establecí la configuración regional apropiada en Python y luego trato de analizar la fecha con strptime . Por ejemplo:

 locale.setlocale(locale.LC_ALL, "deu_deu") # Locale name on Windows datetime.strptime(dt, "%B %Y") 

Al encontrar un mes con un carácter no ASCII en su nombre, obtengo un UnicodeEncodeError . La fecha se extrae de un archivo XML entregado a través de un servicio web. ¿Hay alguna forma en que pueda transformar mi cadena de fecha para que funcione con strptime ?

EDITAR

 datetime.strptime(dt.encode("iso-8859-16"), "%B %Y") 

trabajó.

No hay respuesta, solo una prueba (en Unix, sin embargo):

 >>> import locale, datetime >>> locale.setlocale(locale.LC_ALL, "de_de") >>> datetime.datetime.strptime("März 2012", "%B %Y") datetime.datetime(2012, 3, 1, 0, 0) 

Lo anterior funciona como se espera. Ahora simule unicode como entrada – März contiene una LETRA A LATINA PEQUEÑA CON DIAERESIS :

 >>> datetime.datetime.strptime("M\u00E4rz 2012", "%B %Y")) ... UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' ... 

Lo mismo se puede lograr con la función Unicode incorporada:

 >>> datetime.datetime.strptime(unicode("März 2012", "utf-8"), "%B %Y") ... UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' .... 

Ahora intente con la encoding apropiada:

 >>> datetime.datetime.strptime(u"M\u00E4rz 2012".encode('utf-8'), "%B %Y") datetime.datetime(2012, 3, 1, 0, 0) 

Nuevamente, esto no está en Windows, por lo que no es realmente una respuesta, pero puede contener una pista.


Solo para investigar un poco más, un escenario donde uno trata con una fuente externa de datos (utilizando JSON para este ejemplo, YMMV para XML):

Creo que un codificador JSON adecuado te dará unicode, y RFC4627 parece sugerir que:

Cualquier personaje puede ser escapado. Si el personaje está en el Plano Multilingüe Básico (U + 0000 a través de U + FFFF), entonces puede representarse como una secuencia de seis caracteres: un solidus inverso, seguido de la letra minúscula u, seguido de cuatro dígitos hexadecimales que codifican el Punto de código del personaje. Las letras hexadecimales A a F pueden ser mayúsculas o minúsculas.

Entonces, para simular eso con python (nadie analizaría JSON de esa manera, esto es solo una simulación):

 >>> import json >>> s = json.dumps({"date" : "März 2012"}).split(":")[1].replace( '"', "").replace("}", "").strip().decode("unicode_escape") >>> # and sure enough ... >>> datetime.datetime.strptime(s, "%B %Y") ... UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4 ... >>> # and again, with the right encoding ... >>> datetime.datetime.strptime(s.encode("utf-8"), "%B %Y") datetime.datetime(2012, 3, 1, 0, 0) 

El siguiente código resuelve el problema.

 locale.setlocale(locale.LC_ALL, "deu_deu") # Locale name on Windows datetime.strptime(dt.encode("iso-8859-16"), "%B %Y")