Если я хочу использовать кодировку UTF-8, по умолчанию для python, нужно ли мне кодировать мои строковые переменные в байтовые переменные? - PullRequest
0 голосов
/ 25 сентября 2019

Если у меня есть строка, которую я хочу использовать в байтовой форме, закодированной как UTF-8, нужно ли мне кодировать переменную как байтовую переменную?Или, поскольку Python по умолчанию закодирован как UTF-8, будет ли он обрабатывать строку как байтовую форму UTF-8 в определенных контекстах без явного кодирования?

Например, я работаю над проектом, в котором у меня есть массив словарей, которые отображают строки в строки.Если я записываю этот массив в файл с помощью json.dump, а затем читаю его с помощью json.load, строки восстанавливаются очень хорошо, и я не получаю ошибок, несмотря на то, что никогда не кодирую.Это указывает на то, что если вы просто используете UTF-8, вам на самом деле не нужно конвертировать в байтовую форму.Я ошибаюсь?Если я прав, тем не менее, это плохая практика?Мой пример был бы другим, если бы я просто писал строки без JSON?

1 Ответ

1 голос
/ 25 сентября 2019

Python имеет несколько значений по умолчанию для кодирования.В Python 3 ситуация выглядит следующим образом:

  • Кодировка исходного файла по умолчанию - UTF-8.Вы можете переопределить это комментарием в одной из первых двух строк модуля (# coding: latin-1), если это действительно необходимо.Он влияет только на строковые литералы (и имена переменных).
  • Параметр encoding для str.encode() и bytes.decode() тоже относится к UTF-8.
  • Но когда вы открываете файл с помощью open(), тогда значение по умолчанию для encoding зависит от обстоятельств (ОС, переменные env, версия Python, сборка).Вы можете проверить его значение с помощью locale.getpreferredencoding().Это значение по умолчанию также используется, когда вы читаете из sys.stdin или используете print().

Так что я бы сказал, что можно положиться на значения по умолчанию для первых двух случаев (это официально рекомендуется дляпервый).Но третий хитрый: IO по умолчанию - UTF-8 во многих системах, поэтому вы можете подумать , что with open(path) as f: всегда будет использовать UTF-8, потому что это было так во время разработки, но затем вы портируетескрипт на другой сервер, и внезапно он вызывает UnicodeErrors или выдает бред.

Часто для обработки текста не нужно иметь дело с закодированными строками (т. е. bytes объектами).Скорее, вы обязательно должны декодировать его при чтении и кодировать при написании / отправке текста.Это делается автоматически для потоков, созданных с помощью open() (если не указан двоичный режим 'rb' / 'wb').Если вы думаете, что ввод / вывод должен быть UTF-8, то вы должны явно указать encoding='utf8' при вызове open().

...