2014-11-10 1 views
0

Я прочитал Python2 Unicode HOWTO и Unicode In Python, Completely Demystified понимать систему Unicode Python, и я встретил какой-то код вроде этого:Когда мы пишем строку в файл, почему нам нужно заботиться о кодировке?

f = open('test.txt','w') 
f.write(uni.encode('utf-8')) 
f.close() 

Почему юникода str нужно быть закодирована, прежде чем он был записан в файл?

Я знаю, что кодировка по умолчанию - ASCII, поэтому будет ошибка, так как вне диапазона.

Но поскольку я пишу его в файл, не просто ли он копирует биты uni в ОЗУ, чтобы файл, зачем программе нужно заботиться о кодировке?

+1

Поскольку только кодировка определяет, какие биты (или, скорее, байты) составляют строку юникода. – sebastian

ответ

1

Юникод-символы являются абстрактными объектами, называемыми кодовыми точками, и имеют несколько кодировок, таких как UTF32, UTF16 и UTF8. Для выражения всех символов в одном объекте потребуется 6 байт на символ (и даже тогда в unicode будут символы с интервалом, чтобы можно было утверждать, что размер еще больше). Чтобы все было запутанно, во многих системах использовались «кодовые страницы», существовавшие до стандартизации Unicode, которые представляют собой разные сопоставления между битами и отображаемыми ими символами.

Юникодными символами Python являются UTF16 в ОЗУ. Поэтому мы сразу видим проблему. Если вы хотите писать как UTF8, строка в памяти не будет работать. Python должен прочитать строку UTF16 в памяти и написать строку UTF8.

Существует еще одна тонкая проблема, которая заключается в том, что процессоры на базе процессоров Intel являются «малоконечными», но многобайтовые кодировки Unicode являются «большими эндитами» (что означает, что байты внутри слова упорядочены по-разному). Даже если вы хотите написать UTF-16, необходимо внести изменения. Из-за этой маленькой/большой проблемы обычно записывается спецификация (байтовый порядок) в начале строк, чтобы энкодеры могли угадать формат.

Персонажи могут быть выражены разными способами (кодировками), так что должно быть по умолчанию? это историческая вещь. Поскольку ACSII был таким, как это было сделано за всю историю (ну, по крайней мере, история unix), по-прежнему она по умолчанию.

При написании недвоичных данных мы всегда должны проходить через какой-то кодек. Это цена, которую мы платим за время, затрачиваемое на многоязычные вычисления, и чтобы вычислительные системы стали достаточно мощными, чтобы справиться с этим. Ни в коем случае мой Commodore 64 не имел бы дело с Phoenician.

+0

Вы даже не можете указать что-либо окончательное относительно формата внутренней RAM строк Unicode, поскольку оно было изменено в [Python 3.3] (https://docs.python.org/3/whatsnew/3.3.html). –

+0

@MarkRansom - Я этого не знал. Я знал, что python может скомпилировать UTF16 или UTF32 (по крайней мере, в тот же день), но похоже, что это только смутило бы проблему. – tdelaney

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