2013-02-24 24 views
6

Mam problem z konwertowaniem wielkich liter z umlautami na małe litery.python: lower() german umlauts

print("ÄÖÜAOU".lower()) 

A, O i U zostaną poprawnie skonwertowane, ale wartości Ę, Ö i Ü pozostaną wielkie. Jakieś pomysły?

Pierwszy problem został rozwiązany z .decode ('utf-8'), ale mam jeszcze drugi:

# -*- coding: utf-8 -*- 
original_message="ÄÜ".decode('utf-8') 
original_message=original_message.lower() 
original_message=original_message.replace("ä", "x") 
print(original_message) 

Traceback (najnowsza wezwanie ostatni): Plik "Untitled.py" linia 4, w original_message = original_message.replace ("a", "x") UnicodeDecodeError: 'ASCII' kodek nie potrafi dekodować bajtowy 0xc3 w pozycji 0: nie porządkowej w zakresie (128)

+3

Czy używasz pythona 2 lub 3? –

+0

Python 2.7.2 ten dostarczany z OSX. – user2104634

+3

@ user2104634 Twój problem. –

Odpowiedz

8

będziesz trzeba oznaczyć go jako ciąg znaków Unicode, chyba że pracujesz z prostym ASCII;

> print(u"ÄÖÜAOU".lower()) 

äöüaou 

Działa to samo podczas pracy ze zmiennymi, wszystko zależy od typu przypisanego do zmiennej na początek.

> olle = "ÅÄÖABC" 
> print(olle.lower()) 
ÅÄÖabc 

> olle = u"ÅÄÖABC" 
> print(olle.lower()) 
åäöabc 
+0

Mam # - * - kodowanie: utf-8 - * - w pierwszym wierszu wygląda jak jego wersja Pythona jak sugeruje BlaXpirit. – user2104634

+0

@ user2104634 Powyższy przykład został uruchomiony na standardowym Pythonie 2.7.2 na Mac OS X. Bez oznaczania jako Unicode konwertuje tylko znaki ASCII na małe litery, ze znacznikiem "u", podaje poprawne dane wyjściowe. –

+0

Więc tag na początku nie wystarczy? – user2104634

2

Masz do czynienia z zakodowanymi ciągami znaków, a nie z tekstem w Unicode.

Metoda łańcuchów bajtowych .lower() może zajmować się tylko wartościami ASCII. Zdekodować swój ciąg Unicode lub użyć unicode dosłowny (u''), a następnie małymi literami:

>>> print u"\xc4AOU".lower() 
äaou 
+0

@ user2104634: musisz przeczytać [Python Unicode HOWTO] (http://docs.python.org/2/howto/unicode.html); dekodujesz zmienną do wartości 'unicode' (' variable.decode (encoding ') '). –

1

Jeśli używasz Python 2, ale nie chce poprzedzić u „” na wszystkich strunach umieścić to na początku o programie:

from __future__ import unicode_literals 
olle = "ÅÄÖABC" 
print(olle.lower()) 

spowoduje powrót:

åäöabc 

kodowanie określa jak interpretować znaki odczytywane z dysku w progr am, ale z _ _ future __ import statement mówi, jak interpretować te napisy w samym programie. Prawdopodobnie będziesz potrzebować obu.