2010-02-23 22 views
9

Chcę przekształcić ciągi znaków UTF-8 za pomocą wbudowanych funkcji, takich jak upper() i capitalize().UTF-8 i górny()

Na przykład:

>>> mystring = "işğüı" 
>>> print mystring.upper() 
Işğüı # should be İŞĞÜI instead. 

Jak mogę rozwiązać ten problem?

Odpowiedz

14

Nie wykonuj akcji na zakodowanych ciągach; najpierw dekoduj do unicode.

>>> mystring = "işğüı" 
>>> print mystring.decode('utf-8').upper() 
IŞĞÜI 
+1

Dane wyjściowe wygenerowane przez tę odpowiedź (IŞĞÜI, zaczynając od U + 0049 LATYNOWY LITER KAPITAŁOWY I) różni się od poprawnego wyniku dostarczonego przez pytanie (İŞĞÜI, poczynając od U + 0130 LATIN CAPITAL LIST I I WITH DOT ABOVE). – thomasd

9

To rzeczywiście najlepiej, zgodnie z ogólną strategią, aby zawsze zachować swój tekst jako Unicode raz to w pamięci: dekodować go w tej chwili jest to wejście, i zakodować go dokładnie w tym momencie trzeba wyjściem byłoby, gdyby istnieją specyficzne wymagania dotyczące kodowania na wejściach i/lub czasach wejścia.

Nawet jeśli nie zdecydujesz się na przyjęcie tej ogólnej strategii (i powinieneś!), Jedynym sposobem na wykonanie wymaganego zadania jest jeszcze dekodowanie, przetwarzanie, kodowanie ponownie - nigdy do pracy na kodowanym formularze. Np .:

mystring = "işğüı" 
print mystring.decode('utf-8').upper().encode('utf-8') 

zakładając, że jesteś ograniczony do zakodowanych ciągów podczas przypisywania i do celów wyjściowych. (Ograniczenie wyjściowe jest niestety realistyczne, ograniczenie przypisania nie jest - po prostu wykonaj mystring = u"işğüı", odznaczając je od początku na Unicode i zachowaj przynajmniej wywołanie .decode! -)

+3

Ta sama strategia to dobry pomysł na terminy/czasy. Konwertuj na UTC (lub przynajmniej TZ aware) natychmiast po wprowadzeniu i powróć do właściwej strefy czasowej, gdy jest wyprowadzana. Rozwiązuje to wiele problemów z różnymi strefami czasowymi i zmianą czasu letniego. –

+0

@gnibbler: Dobra uwaga, zgadzam się. I dla wielu obliczeń finansowych, konwersja danych wejściowych bezpośrednio na dziesiętne (zamiast akceptowania domyślnych wartości liczbowych) może uniknąć wielu "gdzie zniknął ten grosz" z powodu nocnych księgowań ;-). –