2010-03-25 1 views
1

Я хотел бы преобразовать эту строкуКак преобразовать строку UTF со скандинавскими символами в ASCII?

foo_utf = u'nästy chäräctörs with å and co.' # unicode 

в этом

foo_ascii = 'nästy chäräctörs with å and co.' # ASCII 

.

Любая идея, как это сделать в Python (2.6)? Я нашел unicodedata модуль, но я понятия не имею, как это сделать.

+8

У ascii нет å ä ö и других, вы хотите что-то еще, например. iso 8859-1 (латинский-1) или utf-8? – nos

+0

Мне, вероятно, придется немного переформулировать вопрос. Я столкнулся с проблемой при разработке тега шаблона для Django. Я заметил, что он работает очень хорошо при использовании обычных строк, но сбой при использовании точно подобной строки юникода. –

+1

Ваша верхняя строка не является формой UTF. UTF - кодировки в кодировке unicode, что означает, что они представляют собой последовательности байтов, которые представляют символы Unicode. То, что у вас есть, представляет собой строку юникода, которая представляет собой последовательность символов. Количество байтов в каждом случае не имеет значения и невозможно определить изнутри python. Различие - не просто педантизм. Понимание того, что делает python с вашим текстом, поможет вам избежать этих досадных 'Unicode {En, De} codeError's. – jcdyer

ответ

2

Это действительно вопрос Django, а не питон. если строка находится в одном из ваших файлов .py, убедитесь, что вы имеете следующую строку в верхней части файла: -*- coding: utf-8 -*-

Кроме того, ваша строка должна быть «Юникод» типа (u'foobar»)

И убедитесь, что ваш HTML страница работает в Юникод:

<meta http-equiv="content-type" content="text/html;charset=utf-8" />

Это должно сделать весь трюк. Никакого кодирования/декодирования и т. Д. Не требуется, просто убедитесь, что все является юникодом, и вы находитесь в безопасности.

+0

Спасибо за отличные указатели. Мне удалось проследить проблему до преобразования str в коде, который разбил ее на части. Я нашел и другие комментарии проницательными. :) –

+0

Также, фактически сохраните файл в utf-8, чтобы он соглашался с объявлением кодирования. –

3

Попробуйте метод encode.

>>> u'nästy chäräctörs with å and co.'.encode('latin-1') 
'n\xe4sty ch\xe4r\xe4ct\xf6rs with \xe5 and co.' 
4

Я не думаю, что вы можете. Эти «nästy chäräctörs» не могут быть закодированы как ASCII, поэтому вам придется выбирать другую кодировку (UTF-8 или Latin-1 или Windows-1252 или что-то еще).

+0

Это правда. ASCII содержит только 127 символов и не имеет диакритических знаков. Его можно преобразовать в ANSI, если вы выберете правильную кодовую страницу.В любом случае лучше придерживаться Unicode, если у вас нет другого выбора. –

+0

Спасибо. Неплохо подмечено. Я полностью об этом забыл. :) –

2

Вы также можете использовать модуль unicodedata (http://docs.python.org/library/unicodedata.html), предоставляемый в python, для преобразования большого количества значений unicode в вариант Ascii. IE фиксирует разные «s» и т. Д. Следуйте за этим методом encode(), и вы можете полностью очистить строку.

Метод, который вы, главным образом, из того, что из unicodedata нормализуется и передает ему флаг NFKC.

3

Есть несколько вариантов в codecs модуля в STDLIB питона, в зависимости от того, как вы хотите, расширенные символы обрабатываются:.

>>> import codecs 
>>> u = u'nästy chäräctörs with å and co.' 
>>> encode = codecs.get_encoder('ascii') 
>>> encode(u) 
' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128) 
>>> encode(u, 'ignore') 
('nsty chrctrs with and co.', 31) 
>>> encode(u, 'replace') 
('n?sty ch?r?ct?rs with ? and co.', 31) 
>>> encode(u, 'xmlcharrefreplace') 
('n&#228;sty ch&#228;r&#228;ct&#246;rs with &#229; and co.', 31) 
>>> encode(u, 'backslashreplace') 
('n\\xe4sty ch\\xe4r\\xe4ct\\xf6rs with \\xe5 and co.', 31) 

Надеюсь, один из тех, кто будет отвечать вашим потребностям Там больше информации в Python codecs module documentation

.