Найти - Пользователи
Полная версия: Отображение utf-8 в консоли Windows
Начало » Python для новичков » Отображение utf-8 в консоли Windows
1 2 3
trambalda
Всех с наступившим, желаю разнообразных благ и радостей -)

Никак не пойму где неверно загнуты мои руки. Есть код:
# coding: utf-8

print("\N{Latin capital letter a with grave}")
print("абвгдеёжзийклмнопрстуфхцчшщъыьэюя")
Файл сохранен в кодировке utf-8.
Подкрутил файл \Lib\encodings\aliases.py в Питоне, как указано тут: http://bugs.python.org/issue6058
Запускаю консоль cmd.exe /u, меняю в настройках окна шрифт на Lucida Console, переключаюсь на кодовую страницу utf-8: chcp 65001.
Запускаю скрипт, получаю на выходе нечто невразумительное:
c:\dev>c:\python31\python test.py
À
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
рстуфхцчшщъыьэюя
щъыьэюя
эюя
я
Traceback (most recent call last):
Fite "test.py", line 4, in <module>
print("абвгдеёжзийклмнопрстуфхцчшщъыьэюя")
стуфхцчшщъыьэюя")
ъыьэюя")
я")
)
IO Error: [Errno 13] Permission denied
Как это побороть - решительно непонятно. Может кто-нибудь сталкивался с подобным?
А может есть какая-нибудь прямая альтернатива консоли с выводом в юникоде? IDLE - с принципом в одном окне открой, в другом получи вывод, не хочется.
Андрей Светлов
А зачем вам понадобился этот патч? Я что-то не уловил его важность… 65001 очень сильно отличается от стандартного utf-8?
Теперь по сути дела:
- Не вижу причин для permission denied - и не могу воспроизвести локально. Вероятно, это ваша специфическая ошибка. Вызванная либо особенностями конкретно вашей винды - или криво наложенным патчем.
- вы пытаетесь запустить консоль в unicode режиме. Unicode != UTF-8.
- вероятно, требуется настроить sys.stdout так, чтобы он представлял собой объект с кодировкой вроде unicode-enscape (по умолчанию на винде при любых настройках консоли stdin/stdout настроены на locale.getpreferredencoding())
trambalda
Для того чтобы консоль могла выводить данные в utf-8, надо сменить кодировку, по умолчанию там включается досовская 866. Кодировка меняется командой chcp. Команда chcp не знает что такое utf-8, и ей надо указать код, этим кодом является “65001” (http://msdn.microsoft.com/en-us/library/system.text.encoding%28VS.80%29.aspx).

Без патча, а его суть просто добавление алиаса (одна строка, криво его добавить очень затруднительно), питон не понимает, что это за странная кодировка 65001 и выдает ошибку.
Запуск консоли без /u дает то же самое сообщение.

Как вообще делают грамотные люди, если требуется видеть utf-8 в консоли? Судя по всему делать свое собственное окно, и тащить за собой Gtk или Qt?
igor.kaist
нужен именно utf-8 или просто кириллица?
Если просто кириллица, то проще всего перекодировать юникод в cp866.
Если utf-8, то я не совсем понимаю, зачем он нужен виндовой консоли :)
trambalda
Нужен именно utf-8. Было бы полезно знать как это делается. Просто раз есть консоль, есть возможность смены кодировки, есть шрифт, который содержит уйму символов, тот же самый знак евро, греческие буквы… почему бы и нет?
vaxXxa
Тема явно не относится к Питону.

Может помогут ссылки:
http://stackoverflow.com/questions/5419/python-unicode-and-the-windows-console
http://wiki.python.org/moin/PrintFails
Андрей Светлов
Кажется, cmd в 65001 - это не совсем utf-8. По крайней мере попытка вывести даже через raw io добавляет мусор в конец. Вывод в файл дает нормальный контент. Нет никаких свелых идей. Гадость этот cmd.exe
igor.kaist
m.meehalkoff, вы поняли сами, что написали?
m.meehalkoff
igor.kaist
Пардон.

Вот как я решил вопрос с отображением кирилицы в виндовой консоли.

Пишем функцию, которая тупо перекодирует utf-8 в понятную для виндовой консоли cp1251
def utf(promt):
return promt.decode('utf8','cp1251')
Ну и потом где нужно вывести кирилицу в консоль делаем так:
print utf("Какой то текст")
Как то так в общем.
truporez
Вот такой скрипт выводит надпись и без выкрутасов с функцией

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

print u"Может так лучше?"
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB