Ответы пользователя по тегу Кодировка символов
  • Как отправить запрос, содержащий русские буквы pymysql?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Используйте уже третий питон.
    2. Используйте utf-8 в коде.
    3. Если уж приспичило, используйте юникодные строки.
    4. Не пользуйтесь виндой. Там-поди до сих пор зоопарк из cp866, сз1251 и utf-8 в консолях, шелл скриптах и везде...
    5. Приспичила винда, да и вообще, примите за правило: на входе люьой текст приводите к юникоду, на выходе выводите в целевую кодировку.
    Из какой и в какую кодировку - читайте в параметрах потокв ввода/ывода. Если там не указано, попробуйте различить связан ли поток с файлом или с терминалом. В файл можно писать любую кодировку, главное правильно сконвертировать и не смешивать. В терминал писать нужно либо в юникоде (если указана кодировка в параметрах потока, то питон сам преобразует), либо в целевой кодировке, которую можно настроить/угадать, предположить и подобрать с нескольких попыток.

    Но лучше всего пользуйтесь третьим питоном. Там с юникодом все гораздо проще и однозначнее, чем во втором.
    Ответ написан
    Комментировать
  • Как решить проблему с нарушением кодировки при выгрузке файлов через ФТП?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    У вас там на странице указана кодировка "windows-1251".
    Нужно везде использовать utf-8 и таких проблем не будет.
    1. Смените кодировку редактора, чтобы буквы стали нормальными, вырежьте текст страницы в буфер обмена.
    2. Смените кодировку редактора на utf-8 и вставьте текст страницы обратно. Кириллица должна остаться нормальной, но уже в другой кодировке.
    3. В теге meta укажите charset=utf-8.
    4. Сохраните и залейте FTP
    5. ...
    6. PROFIT!!!111
    Ответ написан
    Комментировать
  • Странное поведение pycharm?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сейчас я проясню ситуацию=).
    Текст бывает либо в какой-то кодировке (cp1251, utf-8, win866, ascii, и т.д.), тогда это байты; либо в юникоде (это, как бы, абстрактное представление символов), тогда это строки из абстрактных юникодовых символов.
    Все файлы, потоки ввода-вывода и т.д. у нас в компьютере работает с байтами, а не с абстрактными юникодовыми символами. Это значит, что перед выводом в файл или консоль должно производиться кодирование юникода в конкретную кодировку.
    Кодировка -- это способ представить байтами абстрактных символов юникода. Каждый юникодовый символ, в зависимости от кодировки, будет задаваться одним или более байтом. Некоторые абстрактные символы не поддерживаются некоторыми кодировками.

    Так, например, кодировка ascii поддерживает только стандартные 128 символов и при попытке конвертировать в неё (явно или неявно) букву "Ж", будет такая же ошибка как у вас. Надо полагать метод parse в вашем случае возвращает юникод, а оператор print делает неявное преобразование в кодировку по умолчанию (ascii, судя по сообщению об ошибке).
    Осталось выяснить в каких случаях как определяется кодировка по умолчанию.
    Артём Клименко правильно предложил в своём ответе проверить что берётся в качестве кодировки по умолчанию в том и другом случае.
    Однако решением проблемы должно быть явное преобразование текста в нужную кодировку. Я в таких случаях придерживаюсь следующих правил:
    • Всё, что приходит в программу, привожу в юникод (если это не произошло неявно в той библиотеке, посредством которой я получил данные).
    • В программе работаю с текстом только в юникоде (если речь не идёт о каких-то низкоуровневых операциях над байтами, вроде парсинга протоколов и прочего.
    • Перед выводом конвертирую текст в нужную кодировку или настраиваю потоки вывода на автоматическое преобразование.
    • Когда не понятно в какой кодировке делать вывод, руководствуюсь следующими правилами:
      • Выходной поток -- это виндовый stdout и в нём не задана кодировка (bat-файлы, консоль) -- cp866
      • Файлы, БД и прочее, что поддерживает юникод и сделано правильно -- UTF-8
      • Когда в винде не помогают пердыдущие пункты -- cp1251
      • В других операционках utf-8.


    Подчеркиваю. Если выходной поток сконфигурирован на ascii, а у нас в программе могут попасться не-ascii символы, то нужно приводить текст в какую-то кодировку (см выше)), а иначе ничего не трогаем и пишем юникод.
    Ответ написан
    Комментировать