2014-12-11 14 views
5

Buduję mały API RESTful z butelką w pytonie i mam obecnie problem z kodowaniem znaków podczas pracy z obiektem żądania.Prośby o butelki Pythona i unicode

Uderzając w górę http://server.com/api?q=äöü i patrząc na request.query['q'] na serwerze dostaje mnie "äöü", co oczywiście nie jest tym, czego szukam.

To samo dotyczy żądania POST zawierającego klucz urlowany w kształcie formularza q o wartości äöü. request.forms.get('q') zawiera "äöü".

Co tu się dzieje? Naprawdę nie mam opcji dekodowania tych elementów z innym kodowaniem, czy ja? Czy istnieje ogólna możliwość przechowywania butelki w unicode?

Dzięki.

Odpowiedz

7

request.query['q'] i forms.get('q') zwraca wartość bajtu surowego przesłaną przez przeglądarkę internetową. Wartość äöü, przesłana przez przeglądarkę jako zakodowane w UTF-8 bajty, to '\xc3\xa4\xc3\xb6\xc3\xbc'.

Jeśli wydrukujesz ten ciąg bajtów i miejsce, w którym drukujesz, aby interpretować je jako ISO-8859-1 lub podobną stronę kodową Windows 1252, otrzymasz äöü. Jeśli debugujesz przez drukowanie do wiersza poleceń systemu Windows lub pliku wyświetlanego przez Notatnik, to właśnie dlatego.

Jeśli użyjesz butelki alternative direct property accessrequest.query.q lub forms.q, otrzymasz zamiast tego ciągi znaków Unicode, dekodowane z wersji bajtowej przy użyciu UTF-8. Zazwyczaj najlepiej jest pracować z tymi ciągami Unicode, gdzie tylko możesz. (Chociaż nadal masz problemy z wydrukowaniem ich na konsolę, wiersz polecenia systemu Windows jest notorycznie okropny w radzeniu sobie ze znakami spoza ASCII i jako taki jest złym miejscem do debugowania problemów z Unicode.)

+0

Nie miałem pojęcia o bezpośredniej własności dostęp taki był możliwy. Dziękuję Ci! –

+0

Musi używać w postaci słownika, aby przeszukiwać właściwości niestandardowe wysyłając POST. Istnieje inna alternatywa. Różnica jest tym "request.POST.question_10" jako takim 'request.POST [" question_10 "]'? – Jones

+1

Jeśli chcesz odczytać właściwość z nieidentyfikatorem lub nazwą dynamiczną, zawsze możesz użyć 'getattr', jak w przypadku każdego innego obiektu. np. 'getattr (forms, 'q')' – bobince

Powiązane problemy