2

вопрос простой: как делать, чтобы ST3 нормально печатал русские буквы?

вот программа для примера:

print ('1')
print ('re')
print ('2')
print ('я печатаю')
print ('3')
print ('print')

при таком выполнении я получаю:

введите сюда описание изображения

т.е. теряется не только русский текст, но и соседний английский.

Если я закоменчиваю строку с русским текстом, то получаю полностью рабочую программу: введите сюда описание изображения

Вот такая необъяснимая фигня. ((( Причем вывести закономерность, сколько и какие строки потеряются при наличии русской строки - невозможно. Иногда пропадает ТОЛЬКО русская строка. Иногда - еще 1,2,3,4 соседних английских. Но если в программе русского вывода нет, то все всегда печатается полностью, без глюков и проблемм.

P.S. Сразу скажу: добавление вверху плашки

# -*- coding: utf-8 -*-

не помогает.

User New
  • 333
  • Проверяйте соответствие кодировок. В какой кодировке файл сохраняется, с какой кодировкой запускается интерпретатор? – aleks.andr Feb 07 '17 at 05:59
  • в preferences - settings User у меня прописано "encoding": "cp1251", "fallback_encoding": "Cyrillic (Windows 1251)", я их пробовал в разных комбинациях менять и на cp866 и на utf-8. Ничего не добился. – User New Feb 07 '17 at 10:38
  • 1
    User New, я бы не рекомендовал использование нативных Build System: это неудобно и не очень функционально, см. мой развёрнутый ответ. Вы уже упомянули Console Exec; также порекомендовал бы плагин Terminality, который активно развивается. В Terminality проблема разрешается заменой в настройках UTF-8 на cp1251. Спасибо. – Саша Черных Feb 07 '17 at 12:07
  • 1
    Да, @СашаЧерных именно с вашего (развернутого ответа) я и взял идею о Console Exec. Спасибо. Но с этим есть одна очень бесячая меня проблема. Она изложена в моем вопросе: http://ru.stackoverflow.com/questions/624377/ Может вы с вашим опытом знаете решение? – User New Feb 07 '17 at 12:55
  • 1
    @UserNew: Вам Сmder на англоязычном SO посоветовали. я бы на Вашем месте (лично для меня вот буквы не сливаются, увеличение шрифта в консоли решает проблему) сделал бы feature request в репозитории Console Exec, чтобы можно было бы производить вывод в терминал, предпочтительный для юзера (в Вашем случае cmder), а не только дефолтную консоль. Спасибо. – Саша Черных Feb 07 '17 at 13:39
  • @СашаЧерных, спасибо за совет и за ссылку. Да, я так и сделал на гитхабе. Попросил их об этой фиче. Если хотите - присоединяйтесь к запросу. – User New Feb 07 '17 at 19:08
  • UserNew, подписался на Вашу issue. Terminality пробовали? Есть проблемы? Спасибо. – Саша Черных Feb 07 '17 at 19:32
  • 1
    @СашаЧерных: инструментов, которые требуют однобайтовую кодировку использовать для вывода (такую как cp1251), следует избегать. Даже Windows-консоль поддерживает Unicode API для ввода/вывода (используется в Python 3.6, см. win-unicode-console пакет на более ранних версиях). Если вы GUI консоль используете, то как минимум все BMP символы должны поддерживаться, и также возможен вывод содержимого sys.stdout как текста без конвертации в байты. Если требуется конвертация в байты, то GUI консоль должна поддерживать utf-8/utf-16 чтобы все символы можно было бы представить. – jfs Feb 07 '17 at 23:07
  • @jfs: Вы правы, спасибо. – Саша Черных Feb 08 '17 at 04:32

2 Answers2

2

На данный момент наиболее близкое решение - это исспользование пакета Console Exec. Установить его и в build system дописать

{
    "cmd": ["python", "$file"],
    "target": "console_exec"
}

после этого все печатается, но весь вывод программ - выводится не в ST, а всегда открывается в консоли. В этом есть свои плюсы.

Но строго технически - это не отвечает на вопрос, как заставить ST печатать на русском. Если кто-то даст именно этот ответ - я назначу его ответ "ответом".

User New
  • 333
1

Только что столкнулся с той же проблемой, при настройке проекта для работы через VirtualEnv, в Repl и стандартный вывод начал выдавать такую же картину как в вопросе. Найденное решение простое, создаем свою настройку Build:

{
"cmd": ["python", "-i","-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"encoding": "utf8",

"env": {"PYTHONIOENCODING": "utf-8"}, // Вот эта настройка делает вывод 
                                      // русских символов нормальным
}

Для Repl тоже самое правило:

    {
    "keys": ["f6"],
    "command": "repl_open",
    "args": {
        "cmd": ["python", "-i", "-u", "-m", "pdb", "$file_basename"],
        "cwd": "$file_path",
        "encoding": "utf8",

        "extend_env": {"PYTHONIOENCODING": "utf-8"}, // Вот эта настройка

        "external_id": "python",
        "syntax": "Packages/Python/Python.tmLanguage",
        "type": "subprocess"}
    },