2015-05-19 2 views
4

У меня есть слова со специальными немецкими символами (ÄÖÜäöüß) и вы хотите перебирать слова буквами. Наличие этих специальных символов создает проблемы, потому что они преобразуются в два символа:Хранение umlauts в списках/наборах

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print "ä"   # prints ä 
print len(["ä"])  # prints 1 
print len(list("ä")) # prints 2 

s = set() 
s.add("ä") 
a = next(iter(s)) 

print s  # prints: set(['\xc3\xa4']) 
print a  # prints: ä 
print len(a) # prints: 2 

Что мне нужно изменить, чтобы всегда 1 в качестве ответа, где сейчас 2 печатается?

+0

Сохраните их как символы в Юникоде. Это решает проблему –

+0

Я думаю, что если вы используете 3.x, они будут печатать как 1 длину. Я пробовал ваш код в 3.4.3, и он работал нормально. – Ernesto

+3

Читать это сообщение: [Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать об Unicode и наборах символов (без отговорок!)] (Http://www.joelonsoftware.com/articles/Unicode.html) от Joel Spolsky. И прочитайте статью [UTF-8] (http://en.m.wikipedia.org/wiki/UTF-8) в Википедии. –

ответ

1

Вы можете использовать это в верхней части вашего питона сума (должно быть первое заявление)

from __future__ import unicode_literals

Это имеет эффект неявно применяя префикс u ко всем строкам.

Это not uncontroverisal, но это мое предпочтение как часть хорошей практики, чтобы избежать проблем с Юникодом. Вы также должны сделать, как @Basil Bourque, упомянутый в комментариях, и прочитать статью об Unicode, чтобы вы были хорошо информированы. И, как и unicode_literals, unicode sandwich важен, чтобы избежать подобных проблем.

3

В Python 2.7, строки Unicode обрабатываются следующим образом:

>>> print "ä" 
ä 
>>> len("ä") 
2 
>>> print u"ä" 
ä 
>>> len(u"ä") 
1 

Используйте префикс u для строки Unicode.