Найти - Пользователи
Полная версия: Unicode console/shell под Windows?
Начало » Python для новичков » Unicode console/shell под Windows?
1 2
Dwarf
Дефолтный cmd.exe, как известно, чрезвычайно убог. В том числе из-за своей OEM"ной (в России это 866) кодировки по умолчанию. Перевод её на юникод через chcp 65001 не выход, ибо каждый раз эту команду набирать неудобно. Если перевести всю консоль на юникод через правку реестра, то ломаются приложения, которые ожидают 866. А другие, например нужный мне ipython, вообще не запускаются, ибо не знают такую кодировку, как 65001.

Думаю поставить отдельный шелл, юникодный по умолчанию, чтобы с комфортом работать в нём:
1. Запускать стандартный python.exe и без проблем выводить на консоль любые юникодные символы. Ибо городить вот такие костыли мне совсем не интересно.
2. Запускать ipython с той же целью
3. Пользоваться идущими с Базами Данных консольными утилитами.
4. Очень хотелось бы как-то выводить “выхлоп” работы питона (конструкция print) в этот самый нестандартный шелл, а не в cmd.exe.
Кроме того, если это важно, буду пользоваться шеллом через программу ConEmu, делающую работу с консолью более удобной.
А также хотелось бы вызывать консоль при работе с Django в PyCharm (ctrl+alt+R -> dbshell). Попробовав это на стандартной cmd.exe, я столкнулся с тем, что Django, как кроссплатформенная программа, ожидает юникодную консоль, а ей подсовывают cmd.exe с доисторической 866. И даже если работать с cmd.exe, совсем непонятно, как при вызове через PyCharm оперативно менять кодировку, предварительно выполняя chcp 65001. Это ещё подкрепляет необходимость в том, чтобы шелл был юникодным по умолчанию и не был завязан ни какие приложения, ожидающие от него иного.

Но требование из последнего абзаца, так и быть, не обязательно, главные - это перечисленные под цифрами 1-4.

Вопрос: насколько это всё возможно на винде?
Dwarf
PyCmd is a ‘smart’ command prompt extension for Windows' cmd.exe
Думаю это не то.
ZerG
это туда же…
но вобще не совсем понятно за чем вам все это надо? вы собрались писать консольное приложение для никсов под вендой?
Dwarf
1. Я хочу использовать некоторые приложения (python.exe, ipython.exe, …) в консоли под виндой без проблем с кодировками, так же, как это происходит в никсах. Просто перейти на никсы я по некоторым причинам не могу (уже пробовал).

2. Если писать консольные приложения на питоне чисто для себя - я бы в идеале тоже хотел иметь юникодную консоль чтобы просто выводить в неё обычным print'ом безо всяких костылей.

3. Если писать консольные приложения на питоне и распространять их - мне бы тоже хотелось иметь юникодную консоль, которую я бы добавлял в инсталлятор своей программы чтобы у пользователь выхлоп шёл именно в неё, а не в дефолтный cmd.exe. Правда я такой подходит никогда не встречал и сомневаюсь, возможен ли он.

ZerG
Вобшем мысль ваша понятна. Вам бы хотелось удобно и без лишних гемороев работать с УТФ-8 под вендой и конкретно в консоли. Вынужден вас очень сильно разочаровать. Само по себе детище некрософта убого и некофигурабельно. Как Вы правильно заметили - сделав разумную замену в реестре мы получим кучу траблов потом при работе другого софта да и самой системы. А говорить про консоль винды совсем уже нечего. Это кстати одна из основных причин почему я ненавижу виндавс - потому что мне для работы (грубо скажем админ+начинающий программист)
жить невозможно, А Как вы успели заметить - это скудное говно ЦМД только тартит нервы.
Я и сам когда-то искал выход но к сожалению мне так и не удалось найти клиент под винду с возможной сменой кодировки…. Так что из логических вариантов способных удовлетворить ваши амбиции - я вижу такие варианты:

1.VirtualBox + *nix система по вашему вкусу (учитывая что вам под программинг - можно выбрать какойто легкий ДМ и простой дистрибутив - взять хотябы тот же crunchbung линукс). Таким образом у Вас винда и виртуалка в качестве ИДЕ - голимый но стопроцентный метод.

2. Пересесть таки с венды на нормальную ОС… Да - потратить немного времени что бы разобраться с ньюансами - но вам же не админить сервера на никсах - так что сильно много прям учить не прийдеться. Зато навеки забываем про вирусы, глки, реестр и прочий дебилизм виндовс.

3. Комбинированный вариант - держать на вашем ПК зоопарк (две системы) винду для Игр, линукс для вебсерфинга программирования и просто для жизни..

4. Самый обезбащенный вариант такой. Под Винду есть ссш сервер. Установите его, и цепляйтесь через тот же putty в ЦМД свой машинки. А вот в патти уже есть и кодировки и много чего. Но учтите тот вариант - что вы будете получать только ту кодировку которую укажете. Например сообщения из питона у вас будут нормальные - а вот от самой веды уже крокозябры. Но учитывая ваши желания думаю весьма еффективный метод !

Дерзайте - рад был помочь если шо !
Dwarf
На линукс я уже много раз пробовал пересесть и постоянно возвращался обратно на Windows. Причина: Win более интуитивна, Линь же призывает читать тонны мануалов для совершения простых, казалось бы, действий. Я предпочитаю читать мануалы по темам, которые мне нравятся, вроде программирования на питоне, нежели по настройке графики/звука/сети путём редактирования конфигов, когда в винде я могу просто это настроить через графический интерфейс и забыть об этом. Кстати о графическом интерфейсе: он в Windows мне нравится больше, ибо он более стабилен, отлажен, и нет проблем со шрифтами и прочим. При этом в Лине более развит консольный софт и в целом ситуация с консолями получше, признаю. Добиться бы в винде юникодной консоли и будет вообще счастье.

Так что первые три предложенных вами варианта я так или иначе уже прошел и меня они, увы, не устроили. Что касается четвёртого, этот вариант весьма интерестен!

Я поставил Bitvise SSH Server, Putty в качестве клиента, более-менее разобрался с ключами, но… встретил пару проблем.

1. Если через SSH войти в командный интерфейс питона (командой python или ipython) - то английские буквы набираются капсом. С русскими всё нормально. Принудительное нажатие шифта не помогает.
2. В Putty выставил Utf-8. При этом обнаружил ещё одну проблему, впрочем в ней нет SSH- или Putty- специфичного, стандартный cmd.exe да и powershell ведут себя точно также.
Суть проблемы в том, что если передавать команду через командную питону, он жутко косячит с кодировками:

В то же время, если вызвать интерактивный интерфейс питона (командой python) и вводить print ‘привет’ уже там - всё окей. Есть идеи, почему оно так?
ZerG
дык, скорее всего то что я вам и говорил. Питон и цмд выводят в разных кодировках ! ето нао уже почитать гугол. Ну и проверьте в настройках ССШ сервера кодировку. А может попроуйте поставить openssh !!! Но в целом у Вас почти все получилось.
Но на счет линукса - это вы зря. Проши те времена когда там надо было чочто много настраивать. Щас ставите дистр и как правило у вас все работает из каробки. Банально - тот же ксорг конф вобще создавать ненадо - все автоматом….
Kultom
А не проще ли просто выводить в консоль не просто строки, а юникод? Я сам для себя эту проблему решил именно так.
вместо
print 'Привет, МИР!'

пишем
print u'Привет, МИР!'

Виндовая консоль отлично принимает юникод. Ещё вариант пересесть на 3-й Питон, там любая строка - это юникод.
Юникод - это вообще наше всё, в той же джанге всё юникодом лучше делать
Dwarf
Kultom
не считайте меня совсем новичком :)

Я и так вывожу юникод, проблема в том, что в виндовой консоли по умолчанию стоит 1-байтовая OEM кодировка, специфичная для каждой страны. В России это 866. Это устаревшая кодировка времён DOS, она поддерживает всего символы русского, английского алфавитов, а также бесполезные нынче символы псевдографики.
Даже если печатать юникод, Python всё-равно незримо переводит его в кодировку консоли. В этом можно убедиться, явно перекодировав юникод в 866 - результат будет одинаковым.
print u'Советский союз'
Советский союз
print u'Советский союз'.encode('866')
Советский союз

Соответственно символы, отличные от тех немногих, что есть в 866, мы уже не выведем, например попытка напечатать символ с Unicode-номером 2600 (увидеть его вы можете тут) приведёт к неудаче:
>>> print u'\u2600'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp866.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2600' in position
 0: character maps to <undefined>

В cmd.exe есть команда, по переводу консоли в UTF-16 (один из видов Юникода):
chcp 65001
но с ней тоже не всё однозначно, её недостаточно и по некоторым причинам приходится городить тонны костылей, чтобы иметь возможность работать с юникодом в винде. Но мне костыльный подход не по нраву, хотелось бы каким-то образом заиметь полноценную юникодную консоль.
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