Pull to refresh

Comments 53

Серьёзно? А причём здесь Windows 10? Вам на стэковерфлоу надо было с вашей находкой

При том, что эффект пойман только на Вин10 и решился средствами Вин10 же.
Ну здорово. А другой софт требует, чтобы в этом месте стояла кодировка 1251. И что, каждый раз менять и перезагружаться?

давно винду в глаза не видел, но предположу что эта галочка добавляет поддержку utf-8 но не ломает уже работающую 1251

В винде есть Unicode API (приминающее строки в UTF-16) и ANSI API (работающее со строками в 1-байтных кодировках), кодировка последнего настраивается под региональный стандарт, например, 1251 для русской локализации. Галочка делает так, чтобы ANSI API работало со строками UTF-8
Интересно, много ли такого «другого софта» осталось. Уже много лет не доводилось в винде руками прописывать кодировку для non-unicode софта (что когда-то было нормой).
Не доводилось прописывать, потому что винда научилась её сама ставить вместе с языком. А софта дофига. Например, весь, скомпилированный старыми версиями Delphi.

Да и новый софт начинающие Windows программисты C/C++ не торопятся писать под unicode, ведь это везде wchar_t, а в древнючих учебниках, с которых копипастят примеры, сплошной char для строк. Только уже опытные, которые понимают зачем все эти вещи, пишут где надо char, где надо — wchar_t, где надо — конвертируют из однобайтной кодировки в utf-16.

Если софт хоть сколько-нибудь общается со сторонними источники данных, то там практически везде utf.

И для однообразия проще везде использовать wchar_t.

В первом пункте вы про какой utf пишете, про utf-8?
А wchar_t вообще platform-specific, может быть как 16-битным, так и 32-битным, но точно отличается от utf-8. Так что, в C/C++ однообразие нам, к сожалению, не светит.
у меня Win10 и такой галочки нет. экспериментальная фунцкия.
в итоге проблема не решена. вы её решили лично на вашем компьютере в вашей комнате. для других решение не подходит…
У нас в группе около десятка человек этим решением успешно воспользовались — так что насчет «лично» вы ошибаетесь. Более того, тут в комментах есть ссылка на обсуждение аналогичной проблемы разработчиками Джанго, где точно такую же рекомендацию давали для Вин8.1 — так что и там эта галочка уже была.
Но я допускаю, что не сумел охватить все возможные ситуации.
Для тех, у кого актуальная версия Windows, вполне подходит.

Насколько я понимаю, вы столкнулись с этой проблемой Django:
https://stackoverflow.com/questions/2137501/django-dumpdata-utf-8-unicode
Там упоминается, что проблема решена в Django 3.1 (но требуется некоторое конфигурирование проекта)
Там есть ссылки на фиксы для старых версий.
(Обсуждение проблемы на сайте Django: https://code.djangoproject.com/ticket/32439)

Тут фактически две проблемы: кодировка туда и кодировка обратно. Первая похожа на то, что вы нашли, о второй ни слова. И еще у меня Django 3.2 — и на нем ничего не решено.

Это тянет на issue к фреймворку, где можно обсудить баг это или фича и, может быть, внести какие-то комментарии в документацию. Зачем статья на хабре не ясно, ну давайте каждую найденную проблему в каждом фреймворке описывать статьёй

Ну не всем же постить переводы гуглем с английского, извините.

А зачем вообще надеяться на какую-то системную кодировку и пытаться исправлять её функцией в стадии бета-версии? Есть же возможность принудительно работать с данными в UTF-8, я правильно понимаю?

Где-то есть, где-то нет. Считывать в принудительной кодировке мы можем, а дампить не получается.

А если консоль запускать как "cmd /U" эффект повторяется? А если перед запуском питона сделать chcp 65001?

Это пока не проверили. Как проверим, напишу что вышло.
Первому пайчарм не удалось научить. А второе приходится делать на каждой запускаемой консоли, что неудобно.

А если установить переменную окружения при запуске PYTHONIOENCODING=UTF-8 , поможет?

Это пока не проверили. Как проверим, напишу что вышло.

На курсах Django в Win10 запускают?
(как страшно жить… ©)

На курсах запускают на том, что у кого из учащихся есть. Чтобы запускать на макбуке последней модели, сперва надо заработать на такой макбук, а для этого надо сперва хотя бы окончить курсы. Ну или можно родиться в семье миллионеров — но это разве что в следующей жизни.

То есть на курсах нет денег на бесплатный Linux, зато есть деньги купить Windows и есть время и желание упражняться в танцах по граблям с питоном и Джанго на Windows?

Вы в точности как персонаж анекдота, который объяснял голодному нищему, что голодать вредно. Если в доме один комп на всех, линукс на него поставить никак не получится — потому что там уже стоит предустановленная винда, и ей активно пользуются остальные члены семьи. А на виртуалку там скорее всего ресурсов не хватит. Поэтому надо заработать на еще один комп, купить его — и поставить наконец линукс.
А чтобы купить еще один комп, надо заработать на этот комп…

Зачем такие сложности? У меня на компе 3 Винды, MacOS и Centos. VmWare спасает!

А вы тоже еще вчера продаваном работали и кроме ворда с экселем на своем компе только в танчики играли? Или у вас двадцать лет опыта в айти?
А то на курсы народ как раз для того и идет, чтоб всему этому научиться, причем часто совсем с нуля.

Не хотел вас обидеть, хотел посоветовать решение. Извините, если тон вас задел.

P.S. у вас указано, что вы сеньор фронтендер ..)

Я не за себя — я-то после десяти лет фронта решил специальность сменить, поскольку могу себе это позволить (хотя и мне оказалось проще и удобнее поднять виртуалку под привычной виндой, чем ковыряться в десктопной убунте, на которую ни одна из моих основных рабочих программ не ставится).
А вот кое-кто из одной группы со мной реально с нуля пришел и без запаса денег на время учебы.
И кстати, виртуалки и линукс в программе курсов есть. Просто у нас там не навязывают, а учат.
И кстати, глубоко личный вопрос: как вам удалось макось в вмварь загнать? Я слышал, что это большая проблема.

скачал с торрента дистрибутив под VmWare… в том и дело, что здесь не надо быть крутым специалистом с крёстным Биллом Гейтсом, просто надо гуглить, гуглить и ещё раз гуглить… столько раз я собирался изобрести костыльный велосипед, и столько раз оказывалось, что уже есть решение проще, надежнее и правильнее ))

Так этому тоже надо научиться. В оффлайне гугля нет.

Не знаю про vmware, а для установки в virtualbox есть готовый скрипт на гитхабе, гуглится по macos virtualbox - пускаешь и делаешь то что он говорит.

Вы не понимаете.
Продать курсы "Django на Windows 10" — это вам не кастрюлю Цептер кому-нибудь втюхнуть.
Это — Искусство с большой буквы.
Понимать надо.

Куда уж нам, грешным. Это вы родились, зная все языки программирования в совершенстве, а первый компьютер вам добрая фея Билл Гейтс на крестины подарила.

Какая это причуда ? Это стандартное поведение системы. Кодировка же win1251

Стандартная кодировка Python 3, в среде которого это работает — UTF-8. Стандартная кодировка SQLite 3, с которой снимается дамп и на которую он накатывается — UTF-8. Стандартная кодировка JSON — на которую рассчитаны все действия с ним как минимум в JS, PHP и том же Python 3 — UTF-8. Поэтому то, что на одном из этапов процесса происходит неожиданное и недокументированное перекодирование, вовсе не стандартно.
Судя по всему, это в самом ядре питона по неясной причине не стали прописывать кодировку по умолчанию, а вместо нее использовали кодировку операционной системы.

Использовали стандартные системные вызовы без указания кодировки. Поэтому по умолчанию используется win1251.

Согласитесь, это не баг или причуда Windows.

Не было там стандартных системных вызовов. Чистый питон.

Чистый питон внутри себя как взаимодействует с внешним миром ?

Самостоятельно отправляет sata команды на HDD и сам собирает Mac/up пакеты ? Или это делает ОС с её abstraction layer ?

Вот тут не могу сказать, не копал настолько. Тем более там внутри уже плюсы, а с ними я почти не знаком.
Но сдается мне, что кодировки лежат несколько выше по уровню абстракции.
Привет! Товарищ  @alex-khv прав.
Python по умолчанию использует системную кодировку. для Windows = cp 1251
Официальный док — В доке как раз написано то самое поведение которое вы наблюдаете:
Windows still uses legacy encodings for the system encoding (the ANSI Code Page). Python uses it for the default encoding of text files (e.g. locale.getpreferredencoding()).

This may cause issues because UTF-8 is widely used on the internet and most Unix systems, including WSL (Windows Subsystem for Linux).


Такая ситуация встречается не только в Django. Крайне рекомендую явно указывать кодировку в которой вы собираетесь читать \ записывать файлы.

В каком шелле запускали проблемную команду, CMD или PowerShell? В статье про это не упоминается.

В пайчарме запускали. Насколько я понимаю, там используется cmd.
Возможно, кому-то пригодится.
По поводу окошка с галкой «Бета...» на последнем скриншоте. Иногда некоторые приложения с русскоязычным интерфейсом отображаются крякозябрами, несмотря на то, что везде в системе выставлен русский (с другими языками не проверял). Есть небольшая особенность на мультиязычных системах. Если изначально ОС была англоязычной (опять же, на других не проверял), а потом установлен и активирован русский пакет локализации, то помогает смена языка в вышеупомянутом окошке — с русского на английский и обратно через перезагрузку. Возможно, переключение опции «Бета...» тоже поможет, но у меня, например, она отключена и я её не трогал.
Спасибо огромное за ваш пост) Оказалось что эта настройка влияет на работоспособность GUI приложений MySQL 5.x.x. Приложение отказывалось читать конфигурационные файлы, убрал эту галочку и всё ок. Сам неделю карпел — думал что не так
А не расскажете ли подробнее, что у вас там получилось?

Этого какие приложения, например?

Для такого заголовка не хватает инфы о том, что именно эта чудо-галка меняет, и где ещё можно огрести приключений от того, что она установлена / снята.
Only those users with full accounts are able to leave comments. Log in, please.