2013-02-24 2 views
6

У меня проблема с преобразованием заглавных букв с умлаутами в нижние регистры.python: lower() german umlauts

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

The A, O и U преобразуется правильно, но Ä, Ö и Ü остается в верхнем регистре. Есть идеи?

Первая проблема решена с .decode ('UTF-8'), но у меня еще второй один:

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

Traceback (самый последний вызов последнего): Файл "Untitled.py", строка 4, в original_message = original_message.replace ("ä", "х") UnicodeDecodeError: 'ASCII' кодек не может декодировать байт 0xC3 в положении 0: порядковый не в диапазоне (128)

+3

Вы используете python 2 или 3? –

+0

Python 2.7.2 тот, который поставляется с OSX. – user2104634

+3

@ user2104634 Есть твоя проблема. –

ответ

8

Вы будете нужно отметить его как строку unicode, если вы не работаете с простым ASCII;

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

äöüaou 

Он работает одинаково при работе с переменными, все зависит от типа, назначенного переменной для начала.

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

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

У меня есть # - * - кодирование: utf-8 - * - в первой строке выглядит как версия Python, как предлагает BlaXpirit. – user2104634

+0

@ user2104634 Вышеприведенный пример был запущен на стандартном Python 2.7.2 на Mac OS X. Без маркировки как unicode он будет преобразовывать только символы ascii в нижний регистр, с маркером 'u', он дает правильный вывод. –

+0

Значит, тега в начале недостаточно? – user2104634

2

Вы имеете дело с закодированными строками, а не с текстом в формате Юникод.

Метод байтовых строк может обрабатывать только значения ASCII. Расшифруйте вашу строку в Unicode или использовать unicode буквальным (u''), то в нижнем регистре:

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

@ user2104634: вам нужно прочитать [Python Unicode HOWTO] (http://docs.python.org/2/howto/unicode.html); вы декодируете переменную в значение 'unicode' (' variable.decode (encoding ') '). –

1

Если вы используете Python 2, но не хотите, чтобы префикс U «» на всех ваших строк поместить это в начале вашей программы:

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

теперь вернуться:

åäöabc 

кодирования определяет, как интерпретировать символы чтения с диска в PROGR am, но из __ future __ import statement говорит, как интерпретировать эти строки в самой программе. Вам, вероятно, понадобятся оба.