2013-03-19 1 views
4

Я не понимаю, что:Почему Python не выделяет специальные символы с помощью upper()?

'ô TRAM'.upper() != 'Ô TRAM' 
'ô TRAM'.upper() == 'ô TRAM' 

Все текстовые редакторы (в том числе и vimemacs) преобразовать «ô TRAM'.upper() к 'Ö TRAM', когда мы просим UPCASE. Почему Python, по-видимому, только выделяет символы [a-zA-Z]? И каково обходное решение?

ответ

3

Что @Thanakon отметил кратко правильно: Вы можете сделать это на Unicode Строка.

Вы спрашивали почему Python не делает этого на «узких» строках. Причина в том, что Unicode - это действительно вещь - с точки зрения памяти и обработки. Это определенно не тривиально. Взгляните на определение Unicode или реализацию ICU Library.

Когда Python был задуман, еще в начале 90-х годов Unicode в строках еще не был большой проблемой. Для сообщества Python обратная совместимость всегда была большой проблемой. Поэтому было бы очень сложно просто «unicode upcasing на узких строках» в некоторой версии 2.x.

Но другие люди не были удовлетворены этим решением в 2000-х годах, поэтому они изобрели новый тип данных : unicode. Если вы разместите свои данные, вы получите полнофункциональные функции Unicode. Есть другие модули для вашего удобства тоже ...

О, и кстати: Узкая строка, которую вы показали должен быть интерпретированы в кодировке, прежде чем она имеет смысл UPCASE его в юникод-иш. Как ваши строки отображаются здесь один многих интерпретаций кодирования (ISO-8859-1, может быть?)

Но теперь хорошая вещь: В Python 3 они решили, что стоит нарушить обратную совместимость. Строка по умолчанию - это строка Юникода! Когда вы пишете 'hello' в Python 3, это то же самое, что и в Python 2 u'hello'. И на этом вы получаете Unicode-функциональность.

В любом случае, в Python 2 с u'blah' или Python 3 'blah' вы должны убедиться, что питон-файл сохранен в кодировке UTF-8 (или аналогичный).В Python 3 это standard encoding из *.py -файлов. В Python 2 вы должны add an header-line# -*- coding: utf-8 -*-, содержащий кодировку файлов, или убедитесь, что ваш редактор пишет UTF-8 BOM mark.

10

В Python 3, который по умолчанию использует Unicode, он должен работать.

В Python 2, вы должны заставить его, это будет делать трюк:

u'ô TRAM'.upper() 

u предотвращает текст для перевода в ASCII. (оставаясь юникода)

3

Вы помечено ваш вопрос unicode, но вы никогда не сделали свою строку Юникода:

>>> print u'ô TRAM'.upper() 
Ô TRAM 
>>> print 'ô TRAM'.upper() 
ô TRAM