2012-06-14 2 views
1

В настоящее время я разбираю большие текстовые файлы с Python 2.7, некоторые из которых были первоначально закодированы в Unicode или UTF-8.Смешанное использование кодировок UTF-8 и ASCII?

Для модулей, содержащих функции, которые непосредственно взаимодействуют со строками в UTF-8, я включил # -*- coding: utf-8 -*- в начало файла, но для функций, которые работают только с ascii, я не беспокоился.

В конце концов, эти модули приводят к более крупным модулям, и все разобранные строки смешиваются. Хорошая практика включать # -*- coding: utf-8 -*- в начало каждого файла?

Есть ли преимущества для этого?

+1

Не только любой символ ASCII является допустимым UTF-8, но каждая часть кодированного символа UTF-8 равна ASCII-коду символа ASCII тогда и только тогда, когда это однобайтовый символ ASCII. Это означает, что часть кодированного многобайтового кода никогда не может быть символом ascii. Таким образом, легко найти подстроки ascii, как если бы строка была чистой ASCII. –

ответ

8

# -*- coding: utf-8 -*- объявляет кодировку исходного файла только. Это не имеет никакого отношения к тому, как Python обрабатывает ввод или вывод. Это просто означает, что вы можете писать строковые литералы и комментарии с использованием UTF-8.

Вот что представляет собой действие объявления кодирования. Предположим, у меня есть программа

# -*- coding: utf-8 -*- 
# the following prints the Dutch word "één" 
print(u"\xe9\xe9n") 

Это то, что говорится в комментарии. Но если я удалить coding декларацию, он выходит из строя:

File "a.py", line 1 
SyntaxError: Non-ASCII character '\xc3' in file a.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

Обратите внимание, что линия 1 является комментарий. Программа может быть установлена ​​путем удаления комментария, оставив только

print(u"\xe9\xe9n") 

, который до сих пор ведет себя точно так же, как и в первой программе.

+0

Возможно, я неправильно понимаю, как работают кодировки, но если я добавляю строки к объекту в функции с # - * - кодированием: utf-8 - * - и добавляю другие строки к одному и тому же объекту в функции без # - * - кодирование: utf-8 - * -, нет ли разницы, как если бы в обе функции были добавлены # - * - кодирование: utf-8 - * -? – supernoobie

+0

@supernoobie: нет абсолютно никакой разницы. Это просто объявление о кодировании исходного кода, а не о том, как должна себя вести программа. –

+0

Вопрос о вашем последнем редактировании: «Программа может быть исправлена ​​путем удаления этого, оставив только« не делает третий блок кода точно так же, как второй блок (с отменой объявления кодирования), почему бы ему не ошибиться второй раз? – supernoobie

1

Каждый файл ASCII также является допустимым UTF-8. Не беспокойтесь о том, как обращаться с вашими файлами ASCII как с файлами UTF-8, без необходимости преобразования, без увеличения размера.

Смежные вопросы