#python #windows #encoding #pycharm #byte-order-mark
Вопрос:
После обновления Pycharm до версии 2021.2 всякий раз, когда я создаю новый файл .py на терминале Pycharm с помощью echo, я не могу запустить его из-за следующей ошибки:
SyntaxError: Non-UTF-8 code starting with 'xff' in file [file path...] on line 1, but no encoding declared;
Посмотрев его, я убедился, что pycharm добавляет обязательную спецификацию в созданный файл.
Вещи, которые я пробовал:
Перейдите в Файл -> Свойства файла ->> Удалить спецификацию (ее невозможно удалить)
Перейдите в Файл -> Свойства файла ->> Кодировка файла и измените ее на UTF-8 (появится следующее всплывающее окно):
Тоже не могу его преобразовать.
Перейдите в раздел Справка -> Редактирование пользовательских параметров виртуальной машины и добавление > -Dconsole.encoding=UTF-8
в нее
Создание нового файла python с помощью щелчка работает нормально.
Создание нового файла с помощью echo в терминале cmd тоже работает нормально.
В чем причина этого? Как мне ее решить? У меня не было этой проблемы до обновления Pycharm.
Комментарии:
1. Вы уверены в проблеме? Сообщение об ошибке сообщает вам, что файл имеет формат UTF-16LE, поэтому он не является UTF-8. (и не удаляйте спецификацию на UTF-16). Так что ваш файл не UTF-8, перекодируйте его, прежде чем думать о спецификации. — примечание: Python по умолчанию является исходным кодом UTF-8. Если вы хотите UTF-16, вы должны объявить в начале файла (чего вы не сделали, и поэтому первоначальная ошибка)
2. Я не хочу UTF-16. Я просто хочу создать новый файл с помощью echo на терминале Pycharm. Раньше мне не нужно было ничего объявлять. Я хотел бы знать, как я могу вернуться к этому. Что я должен сделать, чтобы достичь этого?
3. Ваш исходный файл-UTF-16. В этом-то и проблема
4. Но тогда почему это UTF-16? Как мне сделать так, чтобы всякий раз, когда я создаю новый файл с терминала Pycharm, вместо него был UTF-8? И почему я не могу преобразовать его с помощью Pycharm?
5. У меня есть…. AppDataLocalProgramsGitgit-cmd.exe (который он использует bash, и он похож на обычные консоли unix, и он не перекодирует перенаправления) [у вас есть это, если вы установили git]. В противном случае проверьте любую другую консоль. Лучше тот, который также используется в Unix/Linux (создан не для того, чтобы создавать новые сюрпризы, и есть много документации и справки)
Ответ №1:
Как отметил Джакомо Катенацци, изменение терминала на Settings -> tools -> terminal
любой cmd.exe или git-cmd.exe (из powershell.exe) сработало идеально.
Теперь я могу снова создавать файлы с помощью echo на терминале без установки UTF-16 и без спецификации.
Комментарии:
1. Если вы используете cmd, вы просто изменили кодировку с utf16 на кодовую страницу по умолчанию (так что windows-1252 или аналогично). Это может работать правильно, пока вы придерживаетесь ASCII, но это все, это не utf8. PowerShell может сохранять как utf8, а ядро PowerShell да utf8 по умолчанию. Git-cmd также будет работать, но имеет другие ограничения.
2. @voo: какое ограничение git-cmd? Он использует много стандартизированных инструментов и более совместим с терминалами развертывания. PowerShell не так стабилен: слишком много изменений (и, судя по количеству проблем с кодированием и совместимости здесь, в SO, это кажется беспорядком).
3. @Giacomo PowerShell долгое время был стандартным инструментом администрирования сервера в Windows, поэтому он очень стабилен. Ситуация с кодированием также проста (классический PowerShell и ниже использует UTF16-LE, за исключением случаев, когда вы явно указываете ему использовать другую кодировку). А проблемы с git-cmd? Просто попробуйте
echo ähem > test.txt
и посмотрите, выглядит ли полученный файл для вас как правильный UTF-8 (на самом деле я думаю, что у git-cmd могут быть те же проблемы, что и у cmd, я думал о git-bash, у которого есть свои ограничения).4. Если вам нужна действительная поддержка UTF-8, самый простой способ-использовать PowerShell Core или использовать достаточно новую Windows, где вы можете изменить кодовую страницу на кодовую страницу utf8 (хотя это все еще несколько экспериментально, и, в частности, старые оболочки не очень хорошо справляются с этим).
5. @Voo: это дает мне то, что я ожидаю (это зависит от языка, но тот , который использует Юникод, устанавливает его как
en_US.UTF-8
, что довольно стандартно). «PowerShell», «Ядро PowerShell» или последние окна . Ты понимаешь, что я имею в виду? И если мне нужно сохранить двоичные значения (или просто неправильную кодировку) моей программы, я уверен, что перенаправление работает, поэтому я могу отлаживать. Никаких дополнительных инструментов для искажения результатов перенаправления (что затрудняет отладку проблем с кодированием)