Обычно вам нужно использовать и file encoding
, и literal strings encoding
, но на самом деле они управляют чем-то совсем другим , и полезно знать разницу.
Кодировка файла
Если вы планируете писать символы юникода в вашем исходном коде в любом месте, например в комментариях или в буквальных строках, вам необходимо изменить кодировку, чтобы синтаксический анализатор Python работал.Установка неправильной кодировки приведет к исключению SyntaxError
. PEP 263 подробно объясняет проблему и как вы можете управлять кодировкой синтаксического анализатора.
В Python 2.1 литералы Unicode могут быть записаны только с использованием кодировки на основе Latin-1 "unicode-escape".Это делает среду программирования довольно недружественной для пользователей Python, которые живут и работают в странах, не входящих в Latin-1, таких как многие азиатские страны.
...
Python по умолчанию будет ASCII какстандартное кодирование, если не даны другие подсказки по кодированию.
Литеральные строки Unicode
Python 2 использует два различных типа для строк: unicode
и str
.Когда вы определяете литеральную строку, интерпретатор фактически создает новый объект типа str
, который содержит этот литерал.
s = "A literal string"
print type(s)
<type 'str'>
TL; DR
Если вы хотите изменить этоПоведение и вместо этого создайте unicode
объект каждый раз, когда определен строковый литерал без префикса, вы можете использовать from __future__ import unicode_literals
Если вам нужно понять, почему это полезно, продолжайте читать.
Вы можете явно определить буквальную строку как юникод, используя префикс u
.Вместо этого интерпретатор создаст объект unicode
для этого литерала.
s = u"A literal string"
print type(s)
<type 'unicode'>
Для текста ASCII достаточно использовать тип str
, но если вы намерены манипулировать текстом не-ASCII, это важно для использования unicode
типа для правильной работы операций на уровне символов.В следующем примере показана разница в интерпретации уровня символов с использованием str
и unicode
для одного и того же литерала.
# -*- coding: utf-8 -*-
def print_characters(s):
print "String of type {}".format(type(s))
print " Length: {} ".format(len(s))
print " Characters: " ,
for c in s:
print c,
print
print
u_lit = u"Γειά σου κόσμε"
s_lit = "Γειά σου κόσμε"
print_characters(u_lit)
print_characters(s_lit)
Вывод:
String of type <type 'unicode'>
Length: 14
Characters: Γ ε ι ά σ ο υ κ ό σ μ ε
String of type <type 'str'>
Length: 26
Characters: � � � � � � � � � � � � � � � � � � � � � � � �
Использование str
ошибочносообщил, что он имеет длину 26
символов и перебирает символ вернувшийся мусор.С другой стороны, unicode
работал как ожидалось.
Установка sys.setdefaultencoding ('utf8')
В переполнении стека есть хороший ответ о том, почему мы не должныне используйте его:)