Python unicode to cyrillic

How to write Russian characters in file?

This file contains characters in Unicode format which will be lost if you save this file as an ANSI encoded text file. To keep the Unicode information, click Cancel below and then select one of the Unicode options from the Encoding drop down list. Continue?

@Gumbo: the ? is used when the target isn’t able to store the given character because it’s outside the charset range. E.g. databases and output (file/stdout/etc) writers. The � is used when the target is able to display the given character, but don’t do because it’s outside the range of the charset it is instructed to use. E.g. webbrowsers. All with all, it makes sense that ? is been used here.

@Carl — and I was going to suggest that the poster just make them tragic with undercurrents of brooding and mysterious.

@Philipp: I wholeheartedly agree that, but unfortunately the truth is different at many places in many languages. Those «unknown» characters will simply be trashed or replaced. The target doesn’t know «better».

5 Answers 5

Here is a worked-out example, please read the comments:

#!/usr/bin/env python2 # -*- coding: utf-8 -*- # The above encoding declaration is required and the file must be saved as UTF-8 from __future__ import with_statement # Not required in Python 2.6 any more import codecs p = u"абвгдежзийкл" # note the 'u' prefix print p # probably won't work on Windows due to a complex issue with codecs.open("tets.txt", "w", "utf-16") as stream: # or utf-8 stream.write(p + u"\n") # Now you should have a file called "tets.txt" that can be opened with Notepad or any other editor 

I get the error: SyntaxError: non ASCI character ‘\xff’ in file ‘my python file’, but no encoding declared

Читайте также:  Элементы языка программирования java

I did declare the encoding, that’s what the second line is for. And there is no character ‘\xff’ (which is ÿ ) in the file. Are you sure that you did everything correctly, and do all characters show up correctly in Notepad?

Источник

Как я могу получить кириллицу в выводе, Python?

Это выглядит как some_text список объектов Unicode Когда вы печатаете такой список, он печатает reprs элементов внутри списка. Так что вместо этого попробуйте:

Метод join объединяет элементы some_text с пустым пространством, u» между элементами. Результатом является один объект Unicode.

Мне не понятно где some_text происходит (вы вырезали этот бит вашего кода), поэтому я понятия не имею, почему он печатается в виде списка символов, а не строки.

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

>>> text = u'\u0410\u0430\u0411\u0431' >>> print text Traceback (most recent call last): File "", line 1, in UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) >>> print text.encode('utf8') АаБб 

u’\uNNNN’ является ASCII-безопасной версией строкового литерала u’з’ :

Однако это будет отображаться только для вас, если ваша консоль поддерживает символ, который вы пытаетесь напечатать. Попытка вышеупомянутого на консоли на западноевропейской установке Windows завершается неудачно:

>>> print u'\u0437' Traceback (most recent call last): File "", line 1, in File "C:\Python27\lib\encodings\cp437.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_map) UnicodeEncodeError: 'charmap' codec can't encode character u'\u0437' in position 0: character maps to

Поскольку получить консоль Windows для вывода Unicode сложно, Python 2 repr Функция всегда выбирает ASCII-безопасную буквальную версию.

Ваш print оператор выводит repr версия и не печатать символы напрямую, потому что они есть в списке символов вместо строки. Если вы сделали print для каждого из членов списка вы получите символы, выведенные напрямую, а не представленные как u’. ‘ строковые литералы.

Читайте также:  Python call user function

Источник

Кодирование строк

Чтобы компьютер смог отобразить передаваемые ему символы, они должны быть представлены в конкретной кодировке. Навряд ли найдется человек, который никогда не сталкивался с кракозябрами: открываешь интернет-страницу, а там – набор непонятных знаков; хочешь прочесть книгу в текстовом редакторе, а вместо слов получаешь сплошные знаки вопроса. Причина заключается в неверной процедуре декодирования текста (если сильно упростить, то программа пытается представить американцу, например, букву «Щ», осуществляя поиск в английском алфавите).

Возникают вопросы: что происходит, кто виноват? Ответ не будет коротким.

1. Компьютер – человек

Так сложилось, что компьютерная техника оперирует единицами и нулями. На вашей же клавиатуре представлено не менее 100 клавиш. Все, что вы вводите при печати, в итоге преобразуется в те самые бинарные величины.

В этом суть кодировки. ПК запоминает любые буквы, числа и знаки в виде определенного значения из единиц и нулей. Для примера: английская буква «Y» в двоичном коде выглядит как «0b1011001» , а в шестнадцатеричном как «0x59» .

Для осмысленного диалога пользователя и компьютера требуется двусторонний переводчик:
– «человеческие» строки необходимо перекодировать в байты;
– «компьютерную» речь требуется преобразовать в воспринимаемые пользователем осмысленные структуры.

В языке Python за это отвечают функции encode / decode . Важно кодировать и декодировать сообщение в одинаковой кодировке, чтобы не столкнуться с проблемой бессмысленных наборов символов.

2. ASCII

Так как первые вычислительные машины были малоемкими, для представления в их памяти всего набора требуемых знаков хватало 7 бит (или 128 символов). Сюда входил весь английский алфавит в верхнем и нижнем регистрах, цифры, знаки, вспомогательные символы.

Smartiqa Encoding

Поначалу этого вполне хватало. Кодировка получила имя ASCII (читается как «аски» или «эски»). В Пайтоне вы и сегодня можете посмотреть на символы ASCII. Для этого имеется встроенный модуль string .

 import string print(string.ascii_letters) print(string.digits) print(string.punctuation) Результат выполнения кода abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 !"#$%&'()*+,-./:;?@[\]^_`<|>~ 

С другими свойствами модуля можете ознакомиться самостоятельно.

Время шло, компьютеризация общества ширилась, 128 символов стало не хватать. Оставшийся последний 8-ой бит также выделили для кодирования (а это еще 128 знаков). В итоге появилось большое количество кодировок (кириллическая, немецкая и т.п.). Такая ситуация привела к проблемам. Уже в то время англичанин, получающий электронное письмо из России, мог увидеть не русские буквы, а набор непонятных закорючек.

Потребовалось указание кодировок в заголовках документов.

3. Юникод-стандарт

Как вы считаете, сколько нужно символов, чтобы хватило всем и навсегда? 10_000? Конечно, нет. Уже сегодня более 100_000 знаков имеет свое числовое представление. И это не предел. Люди постоянно придумывают новые «буквы».

Откройте свой телефон и создайте пустое сообщение. Зайдите в раздел «смайликов». Да их тут больше сотни! И это не картинки в большинстве своем. Они являются символами определенной кодировки. Если вы застали времена, когда SMS-технологии только начинали развиваться, то этих самых «смайлов» было не более десятка. Лет через 10 их количество станет «неприличным».

Упомянутая выше кодировка ASCII в своем расширенном варианте породила большое количество новых. Основная беда: имея 128 вариантов обозначить символ, мы никак не сумеем внедрить туда буквы других языков. В частности, какой-нибудь символ под номером 201 в кириллице даст совсем не русскую букву, если отослать его в Румынию. Следовательно, говоря кому-то «посмотри на 201-ый символ» мы не даем никакой гарантии, что собеседник увидит то же.

Для решения задачи был разработан стандарт Unicode. Отметим, что это не определенная кодировка, а именно набор правил. Суть юникода – связь символа и определенного числа без возможного повторения. Если мы кого-то попросим показать символ, скрытый под номером «1000», то в любой точке планеты он будет одним и тем же графическим элементом.

Источник

Оцените статью