Peticiones de botella de Python y Unicode.

Estoy creando una pequeña API REST con una botella en Python y actualmente estoy experimentando un problema con las codificaciones de caracteres cuando se trabaja con el objeto de solicitud.

Si presiona http://server.com/api?q=äöü y mira request.query['q'] en el servidor, obtendré “Ã¤Ã¶Ã¼”, que obviamente no es lo que estoy buscando.

Lo mismo se aplica a una solicitud POST que contiene la clave de formulario urlencoded q con el valor äöü . request.forms.get('q') contiene “äöü”.

¿Que está pasando aqui? ¿Realmente no tengo la opción de decodificar estos elementos con una encoding diferente o no? ¿Hay una opción general para la botella para almacenar estos en Unicode?

Gracias.

request.query['q'] y forms.get('q') devuelven el valor de byte sin procesar enviado por el navegador web. El valor äöü , enviado por un navegador como bytes codificados en UTF-8, es '\xc3\xa4\xc3\xb6\xc3\xbc' .

Si imprime esa cadena de bytes y el lugar donde la está imprimiendo se interpreta como ISO-8859-1, o el código de Windows similar 1252, obtendrá äöü . Si está haciendo una depuración imprimiendo en un símbolo del sistema de Windows o en un archivo que se muestra con el Bloc de notas, es por eso

Si utiliza la request.query.q acceso directo a la propiedad alternativa.query.q o forms.q Bottle le dará cadenas Unicode en su lugar, descodificadas a partir de la versión de byte usando UTF-8. Por lo general, es mejor trabajar con estas cadenas Unicode siempre que pueda. (Aunque todavía puede tener problemas para imprimirlos en la consola. El símbolo del sistema de Windows es notoriamente terrible para tratar con caracteres que no son ASCII, y como tal es un mal lugar para depurar los problemas de Unicode).