Что такое кодировка файла
Перейти к содержимому

Что такое кодировка файла

  • автор:

Напоминание

Для понимания материала ОБЯЗАТЕЛЬНО каждый пример пытаться исполнить, понять, почему он работает или не работает, и попробовать в нём что-то поменять, и посмотреть, что получится.

Программирование – это практическая дисциплина, и без успешных попыток что-то сделать руками понимания теории не появляется.

Что такое текстовый файл

С точки зрения операционной системы, и, следовательно, питона, файл – это последовательность байт. (Можно считать, что один байт – это одно число от 0 до 255, то есть если бы у нас был алфавит из 256 букв, то файл из N байт – это N букв этого алфавита).

Общепринято нестрогое и неформальное деление файлов на текстовые и бинарные.

В текстовом файле последовательность байт несёт единственный смысл: последовательность букв текста в человеческом понимании. (В простейшем виде действует соотношение: один байт – одна буква). Т.е. в текстовом файле кроме текста нет ничего. Простейший пример текстового файла – текст, набранный в notepad (он же блокнот) в windows.

В бинарном файле, в зависимости от типа файла (например, картинка JPEG, ролик MKV, документ DOC, архив ZIP) разным байтам придаётся разный смысл: какие-то трактуются как числа, какие-то обозначают яркость канала цвета, какие-то громкость звука. Если бы мы попытались открыть бинарный файл текстовым редактором (например, notepad), то мы увидим непонятную ерунду: потому, что мы те же байты пытаемся интерпретировать с точки зрения другого языка. (Как пытаться расслышать русские слова в китайской речи).

Начиная с этого занятия мы обнаружим, что в питоне гораздо проще общаться с текстовыми файлами.

Понятие кодировки

Кодировка текста – это правила, которые устанавливают, какие байты соответствуют какой букве.

Очень важная кодировка – ASCII. Это одна из довольно старых кодировок, она стандартизована в Америке в 1963 году, и она приписывает 128 различным значениям байта буквы, цифры, и основные знаки пунктуации. В этой кодировке один байт обозначает одну букву, но для некоторых значений байта начертание не определено.

  • cp866, она же DOS
  • cp1251, она же windows-1251
  • koi8-r

Во всех этих кодировках байты с числовыми значениями от 0 до 127 совпадают с ASCII, а остальным значениям приписаны русские буквы (притом везде разными, никак друг на друга не похожими способами).

Для языков, которые используют китайские иероглифы, сделать кодировку с отображением один байт = один символ невозможно, поэтому китайцы, японцы и корейцы посочиняли для себя кодировок, где один иероглиф задаётся последовательностью из двух-четырёх байт рядом.

Всего таких кодировок образовалось порядка тысячи. А для того, чтобы иметь возможность между ними конвертировать тексты, нужно (задача по математике – сколько?) перекодировщиков.

Поэтому в конце 80-х годов возник The Unicode Consortium, который стал собирать реестр всех символов, которые возможно представлять в компьютере. Этот реестр стал называться Unicode.

Идея Unicode в том, что для того чтобы сделать универсальный перекодировщик текстов достаточно для каждой буквы сначала её расшифровать согласно таблицы для соответствующей кодировки и определить место этой буквы в реестре Unicode, а затем выдав представление этой буквы во второй кодировке.

  • utf-8 – это наиболее популярная кодировка сейчас. Она замечательна тем, что для английского текста она совпадает с ASCII (и, соответственно, действует соответствие 1 байт = 1 буква), для русского, греческого, абабского и т.п. в ней действует соответствие 1 буква = 2 байта, а для иероглифов и совсем экзотических символов соотношение становится 1 буква = 3 байта.
  • utf-16 и utf-32 – это способы представлять наиболее употребимую часть реестра уникода в 2 или 4 байта соответственно.

Два типа строк в питоне

Строки, с которыми мы до сих пор работали в питоне, на самом деле были просто списками байтов. Для кодировки ASCII или других однобайтовых кодировок получается только одна беда – мы будем на экран писать те же байты, что и в тексте программы, а если экран отображает другую кодировку, чем в тексте программы, то мы увидим крякозябликов. А для многобайтных кодировок у нас будут получаться ещё и странные результаты про длину строк (количество байт) – она будет оказываться больше, чем количество символов в ней – поэтому я и советовал избегать русского языка.

Уникодовская идея о том, что внутри программы любой текст должен иметь универсальное представление, не зависимое от кодировки – правильная. Питон позволяет этой идеей пользоваться. Для этого в питоне есть ещё один тип строк – это «уникодовские строки».

Уникодовские строки обозначаются в питоне префиксом u перед открывающей кавычкой строки:

 1  print u"Привет" 

Так как даже при прочтении программы питон должен раскодировать её текст и превратить его в универсальное представление, мы должны ему сообщить о том, в какой кодировке хранится текст программы. Для этого нужно в одной из первых двух строк программы добавить комментарий с текстом: coding: имя кодировки. Редактор IDLE добавляет такой комментарий самостоятельно, если только у вас в тексте программы есть не-английские буквы.

  • строка в какой-то кодировке -> decode -> уникодная строка
  • уникодная строка -> encode -> строка в какой-то кодировке
 1  # coding: cp1251  2  s = "Привет"  3  u = s.decode("cp1251") # сработает, если у вас кодировка cp1251  4  s2 = u.encode("cp1251")  5  print s2 

Кроме того, в питоне команда print самостоятельно переводит уникодные строки в кодировку экрана.

Как прочитать и записать файл в питоне

Для работы с файлом в питоне его сначала нужно «открыть».

  • побайтовый – тогда файл открывается функцией open() – в этом случае все функции чтения возвращают обычные строки, а если в файле лежит текст, то за конвертирование кодировок отвечает сам автор программы
  • уникодный – тогда файл открывается функцией codecs.open() – в этом случае питон берёт на себя заботу о кодировках и возвращает в программу уникодные строки

Нас, очевидно, будет интересовать всегда второй способ.

Обе функции первым аргументом получают имя файла. Вторым аргументом – режим работы с файлом: букву ‘r’, если мы хотим файл только читать, ‘w’, если мы хотим в файл только писать. codecs.open имеет ещё и третий аргумент, которым мы указываем, кодировку текста в файле.

Открыв файл, мы получаем файловый объект, вызывая методы которого мы можем что-то делать с файлом.

Самое простое, что можно сделать с файлом – это его открыть и получить весь его текст в виде одной гигантской строки. Для этого у файловых объектов есть метод read:

 1  import codecs  2  file = codecs.open("hello.txt", "r", "utf-8")  3  contents = file.read()  4  print contents 

Пока что для простоты мы будем работать только с файлами, лежащими в той же директории, где и наша питонская программа. В этом случае нам достаточно писать только имя файла. Как быть в других случаях, мы будем разбираться позже.

При общении с файлом у питона всегда есть понятие курсора, как в текстовом редакторе. read читает весь файл от текущего места (которое изначально в начале файла) и переводит курсор в конец файла, так что если мы вызовем read ещё раз, на следующий раз он нам вернёт пустую строку.

Самая частая практическая потребность от файлов – это чтение по строкам. Поэтому в питоне сам объект файла является итератором, идущим по строкам файла. (Если убрать слово итератор, то это утверждение полностью эквивалентно такому: если файл запихать в цикл for, то цикл for будет идти по строкам файла, если файл дать аргументом функции list(), то list() вернёт нам список строк в файле):

 1  import codecs  2  file = codecs.open("hello.txt", "r", "utf-8")  3  for line in file:  4  print len(line), line 

Если мы хотим записать текст в файл:

 1  import codecs  2  file = codecs.open("hello.txt", "w", "utf-8")  3  file.write("Hello,")  4  file.write(" ")  5  file.write("world!\n")  6  file.close() 
  • мы должны указать, что открываем файл для чтения
  • при этом в момент открытия питон создаст такой файл, если его ещё не было, и сотрёт содержимое этого файла, если он уже существовал! Обратите на это внимание: питон не будет спрашивать вас, уверены ли вы в том, что вы хотите стереть этот файл, он его просто сотрёт!
  • для записи в файл мы вызываем метод write, который дописывает наш текст в конец файла.
  • метод write не добавляет перенос строки, поэтому мы должны об этом позабоититься сами и дописать в конец строки ‘\n’
  • символ ‘\n’ в питоне обозначает обычный конец строки
  • чтобы данные оказались у нас на диске, мы должны закрыть файл методом close (здесь история точно такая же как с вытаскиванием флэшки из компьютера: если вы не закроете файл, зачастую у вас всё запишется как нужно, и только в самый ответственный момент окажется, что вы создали пустой файл. За этим тщательно следит Мэрфи)

Бдительный читатель справедливо заподозрит, что sys.stdout, которым мы пользовались на первом занятии, на самом деле есть ни что иное как виртуальный файл, содержимое которого сразу оказывается на экране. Однако я повторяю призыв, что печатать на экран проще с помощью команды print, и давайте мы только ей для этого и будем пользоваться.

Литература

  • http://docs.python.org/2.7/tutorial/introduction.html#unicode-strings
  • http://docs.python.org/2.7/tutorial/inputoutput.html#reading-and-writing-files

Как работают кодировки текста. Откуда появляются «кракозябры». Принципы кодирования. Обобщение и детальный разбор

Данная статья имеет цель собрать воедино и разобрать принципы и механизм работы кодировок текста, подробно этот механизм разобрать и объяснить. Полезна она будет тем, кто только примерно представляет, что такое кодировки текста и как они работают, чем отличаются друг от друга, почему иногда появляются не читаемые символы, какой принцип кодирования имеют разные кодировки.

Чтобы получить детальное понимание этого вопроса придется прочитать и свести воедино не одну статью и потратить довольно значительное время на это. В данном материале же это все собрано воедино и по идее должно сэкономить время и разбор на мой взгляд получился довольно подробный.

О чем будет под катом: принцип работы одно байтовых кодировок (ASCII, Windows-1251 и т.д.), предпосылки появления Unicode, что такое Unicode, Unicode-кодировки UTF-8, UTF-16, их отличия, принципиальные особенности, совместимость и несовместимость разных кодировок, принципы кодирования символов, практический разбор кодирования и декодирования.

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

Предпосылки Unicode

Начать думаю стоит с того времени когда компьютеризация еще не была так сильно развита и только набирала обороты. Тогда разработчики и стандартизаторы еще не думали, что компьютеры и интернет наберут такую огромную популярность и распространенность. Собственно тогда то и возникла потребность в кодировке текста. В каком то же виде нужно было хранить буквы в компьютере, а он (компьютер) только единицы и нули понимает. Так была разработана одно-байтовая кодировка ASCII (скорее всего она не первая кодировка, но она наиболее распространенная и показательная, по этому ее будем считать за эталонную). Что она из себя представляет? Каждый символ в этой кодировке закодирован 8-ю битами. Несложно посчитать что исходя из этого кодировка может содержать 256 символов (восемь бит, нулей или единиц 2 8 =256).

Первые 7 бит (128 символов 2 7 =128) в этой кодировке были отданы под символы латинского алфавита, управляющие символы (такие как переносы строк, табуляция и т.д.) и грамматические символы. Остальные отводились под национальные языки. То есть получилось что первые 128 символов всегда одинаковые, а если хочешь закодировать свой родной язык пожалуйста, используй оставшуюся емкость. Собственно так и появился огромный зоопарк национальных кодировок. И теперь сами можете представить, вот например я находясь в России беру и создаю текстовый документ, у меня по умолчанию он создается в кодировке Windows-1251 (русская кодировка использующаяся в ОС Windows) и отсылаю его кому то, например в США. Даже то что мой собеседник знает русский язык, ему не поможет, потому что открыв мой документ на своем компьютере (в редакторе с дефолтной кодировкой той же самой ASCII) он увидит не русские буквы, а кракозябры. Если быть точнее, то те места в документе которые я напишу на английском отобразятся без проблем, потому что первые 128 символов кодировок Windows-1251 и ASCII одинаковые, но вот там где я написал русский текст, если он в своем редакторе не укажет правильную кодировку будут в виде кракозябр.

Думаю проблема с национальными кодировками понятна. Собственно этих национальных кодировок стало очень много, а интернет стал очень широким, и в нем каждый хотел писать на своем языке и не хотел чтобы его язык выглядел как кракозябры. Было два выхода, указывать для каждой страницы кодировки, либо создать одну общую для всех символов в мире таблицу символов. Победил второй вариант, так создали Unicode таблицу символов.

Небольшой практикум ASCII

Возможно покажется элементарщиной, но раз уж решил объяснять все и подробно, то это надо.

Вот таблица символов ASCII:

Тут имеем 3 колонки:

  • номер символа в десятичном формате
  • номер символа в шестнадцатиричном формате
  • представление самого символа.

Unicode

С предпосылками создания общей таблицы для всех в мире символов, разобрались. Теперь собственно, к самой таблице. Unicode — именно эта таблица и есть (это не кодировка, а именно таблица символов). Она состоит из 1 114 112 позиций. Большинство этих позиций пока не заполнены символами, так что вряд ли понадобится это пространство расширять.

Разделено это общее пространство на 17 блоков, по 65 536 символов в каждом. Каждый блок содержит свою группу символов. Нулевой блок — базовый, там собраны наиболее употребляемые символы всех современных алфавитов. Во втором блоке находятся символы вымерших языков. Есть два блока отведенные под частное использование. Большинство блоков пока не заполнены.

Итого емкость символов юникода составляет от 0 до 10FFFF (в шестнадцатиричном виде).

Записываются символы в шестнадцатиричном виде с приставкой «U+». Например первый базовый блок включает в себя символы от U+0000 до U+FFFF (от 0 до 65 535), а последний семнадцатый блок от U+100000 до U+10FFFF (от 1 048 576 до 1 114 111).

Отлично теперь вместо зоопарка национальных кодировок, у нас есть всеобъемлющая таблица, в которой зашифрованы все символы которые нам могут пригодиться. Но тут тоже есть свои недостатки. Если раньше каждый символ был закодирован одним байтом, то теперь он может быть закодирован разным количеством байтов. Например для кодирования всех символов английского алфавита по прежнему достаточно одного байта например тот же символ «o» (англ.) имеет в юникоде номер U+006F, то есть тот же самый номер как и в ASCII — 6F в шестнадцатиричной и 111 в десятеричной. А вот для кодирования символа «U+103D5» (это древнеперсидская цифра сто) — 103D5 в шестнадцатиричной и 66 517 в десятеричной, тут нам потребуется уже три байта.

Решить эту проблему уже должны юникод-кодировки, такие как UTF-8 и UTF-16. Далее речь пойдет про них.

UTF-8

UTF-8 является юникод-кодировкой переменной длинны, с помощью которой можно представить любой символ юникода.

Давайте поподробнее про переменную длину, что это значит? Первым делом надо сказать, что структурной (атомарной) единицей этой кодировки является байт. То что кодировка переменной длинны, значит, что один символ может быть закодирован разным количеством структурных единиц кодировки, то есть разным количеством байтов. Так например латиница кодируется одним байтом, а кириллица двумя байтами.

Немного отступлю от темы, надо написать про совместимость ASCII и UTF

То что латинские символы и основные управляющие конструкции, такие как переносы строк, табуляции и т.д. закодированы одним байтом делает utf-кодировки совместимыми с кодировками ASCII. То есть фактически латиница и управляющие конструкции находятся на тех же самых местах как в ASCII, так и в UTF, и то что закодированы они и там и там одним байтом и обеспечивает эту совместимость.

Давайте возьмем символ «o»(англ.) из примера про ASCII выше. Помним что в таблице ASCII символов он находится на 111 позиции, в битовом виде это будет 01101111 . В таблице юникода этот символ — U+006F что в битовом виде тоже будет 01101111 . И теперь так, как UTF — это кодировка переменной длины, то в ней этот символ будет закодирован одним байтом. То есть представление данного символа в обеих кодировках будет одинаково. И так для всего диапазона символов от 0 до 128. То есть если ваш документ состоит из английского текста то вы не заметите разницы если откроете его и в кодировке UTF-8 и UTF-16 и ASCII (прим. в UTF-16 такие символы все равно будут закодированы двумя байтами, по этому вы не увидите разницы, если ваш редактор будет игнорировать нулевые байты), и так до момента пока вы не начнете работать с национальным алфавитом.

Сравним на практике как будет выглядеть фраза «Hello мир» в трех разных кодировках: Windows-1251 (русская кодировка), ISO-8859-1 (кодировка западно-европейских языков), UTF-8 (юникод-кодировка). Суть данного примера состоит в том что фраза написана на двух языках. Посмотрим как она будет выглядеть в разных кодировках.

В кодировке ISO-8859-1 нет таких символов «м», «и» и «р».

Теперь давайте поработаем с кодировками и разберемся как преобразовать строку из одной кодировки в другую и что будет если преобразование неправильное, или его нельзя осуществить из за разницы в кодировках.

Будем считать что изначально фраза была записана в кодировке Windows-1251. Исходя из таблицы выше запишем эту фразу в двоичном виде, в кодировке Windows-1251. Для этого нам потребуется всего только перевести из десятеричной или шестнадцатиричной системы (из таблицы выше) символы в двоичную.

01001000 01100101 01101100 01101100 01101111 00100000 11101100 11101000 11110000
Отлично, вот это и есть фраза «Hello мир» в кодировке Windows-1251.

Теперь представим что вы имеете файл с текстом, но не знаете в какой кодировке этот текст. Вы предполагаете что он в кодировке ISO-8859-1 и открываете его в своем редакторе в этой кодировке. Как сказано выше с частью символов все в порядке, они есть в этой кодировке, и даже находятся на тех же местах, но вот с символами из слова «мир» все сложнее. Этих символов в этой кодировке нет, а на их местах в кодировке ISO-8859-1 находятся совершенно другие символы. А конкретно «м» — позиция 236, «и» — 232. «р» — 240. И на этих позициях в кодировке ISO-8859-1 находятся следующие символы позиция 236 — символ «ì», 232 — «è», 240 — «ð»

Значит фраза «Hello мир» закодированная в Windows-1251 и открытая в кодировке ISO-8859-1 будет выглядеть так: «Hello ìèð». Вот и получается что эти две кодировки совместимы лишь частично, и корректно перекодировать строку из одной кодировке в другую не получится, потому что там просто напросто нет таких символов.

Тут и будут необходимы юникод-кодировки, а конкретно в данном случае рассмотрим UTF-8. То что символы в ней могут быть закодированы разным количеством байтов от 1 до 4 мы уже выяснили. Теперь стоит сказать что с помощью UTF могут быть закодированы не только 256 символов, как в двух предыдущих, а вобще все символы юникода

Работает она следующим образом. Первый бит каждого байта кодирующего символ отвечает не за сам символ, а за определение байта. То есть например если ведущий (первый) бит нулевой, то это значит что для кодирования символа используется всего один байт. Что и обеспечивает совместимость с ASCII. Если внимательно посмотрите на таблицу символов ASCII то увидите что первые 128 символов (английский алфавит, управляющие символы и знаки препинания) если их привести к двоичному виду, все начинаются с нулевого бита (будьте внимательны, если будете переводить символы в двоичную систему с помощью например онлайн конвертера, то первый нулевой ведущий бит может быть отброшен, что может сбить с толку).

01001000 — первый бит ноль, значит 1 байт кодирует 1 символ -> «H»

01100101 — первый бит ноль, значит 1 байт кодирует 1 символ -> «e»

Если первый бит не нулевой то символ кодируется несколькими байтами.

Для двухбайтовых символов первые три бита должны быть такие — 110

110 10000 10 111100 — в начале 110, значит 2 байта кодируют 1 символ. Второй байт в таком случае всегда начинается с 10. Итого отбрасываем управляющие биты (начальные, которые выделены красным и зеленым) и берем все оставшиеся ( 10000111100 ), переводим их в шестнадцатиричный вид (043С) -> U+043C в юникоде равно символ «м».

для трех-байтовых символов в первом байте ведущие биты — 1110

1110 1000 10 000111 10 1010101 — суммируем все кроме управляющих битов и получаем что в 16-ричной равно 103В5, U+103D5 — древнеперситдская цифра сто ( 10000001111010101 )

для четырех-байтовых символов в первом байте ведущие биты — 11110

11110 100 10 001111 10 111111 10 111111 — U+10FFFF это последний допустимый символ в таблице юникода ( 100001111111111111111 )

Теперь, при желании, можем записать нашу фразу в кодировке UTF-8.

UTF-16

UTF-16 также является кодировкой переменной длинны. Главное ее отличие от UTF-8 состоит в том что структурной единицей в ней является не один а два байта. То есть в кодировке UTF-16 любой символ юникода может быть закодирован либо двумя, либо четырьмя байтами. Давайте для понятности в дальнейшем пару таких байтов я буду называть кодовой парой. Исходя из этого любой символ юникода в кодировке UTF-16 может быть закодирован либо одной кодовой парой, либо двумя.

Начнем с символов которые кодируются одной кодовой парой. Легко посчитать что таких символов может быть 65 535 (2в16), что полностью совпадает с базовым блоком юникода. Все символы находящиеся в этом блоке юникода в кодировке UTF-16 будут закодированы одной кодовой парой (двумя байтами), тут все просто.

символ «o» (латиница) — 00000000 01101111
символ «M» (кириллица) — 00000100 00011100

Теперь рассмотрим символы за пределами базового юникод диапазона. Для их кодирования потребуется уже две кодовые пары (4 байта). И механизм их кодирования немного сложнее, давайте по порядку.

Для начала введем понятия суррогатной пары. Суррогатная пара — это две кодовые пары используемые для кодирования одного символа (итого 4 байта). Для таких суррогатных пар в таблице юникода отведен специальный диапазон от D800 до DFFF. Это значит, что при преобразовании кодовой пары из байтового вида в шестнадцатиричный вы получаете число из этого диапазона, то перед вами не самостоятельный символ, а суррогатная пара.

Чтобы закодировать символ из диапазона 1000010FFFF (то есть символ для которого нужно использовать более одной кодовой пары) нужно:

  1. из кода символа вычесть 10000(шестнадцатиричное) (это наименьшее число из диапазона 1000010FFFF)
  2. в результате первого пункта будет получено число не больше FFFFF, занимающее до 20 бит
  3. ведущие 10 бит из полученного числа суммируются с D800 (начало диапазона суррогатных пар в юникоде)
  4. следующие 10 бит суммируются с DC00 (тоже число из диапазона суррогатных пар)
  5. после этого получатся 2 суррогатные пары по 16 бит, первые 6 бит в каждой такой паре отвечают за определение того что это суррогат,
  6. десятый бит в каждом суррогате отвечает за его порядок если это 1 то это первый суррогат, если 0, то второй

Для примера зашифруем символ, а потом расшифруем. Возьмем древнеперсидскую цифру сто (U+103D5):

  1. 103D510000 = 3D5
  2. 3D5 = 0000000000 1111010101 (ведущие 10 бит получились нулевые приведем это к шестнадцатиричному числу, получим 0 (первые десять), 3D5 (вторые десять))
  3. 0 + D800 = D800 ( 110110 0 000000000 ) первые 6 бит определяют что число из диапазона суррогатных пар десятый бит (справа) нулевой, значит это первый суррогат
  4. 3D5 + DC00 = DFD5 ( 110111 1 111010101 ) первые 6 бит определяют что число из диапазона суррогатных пар десятый бит (справа) единица, значит это второй суррогат
  5. итого данный символ в UTF-16 — 1101100000000000 1101111111010101
  1. переведем в шестнадцатиричный вид = D822DE88 (оба значения из диапазона суррогатных пар, значит перед нами суррогатная пара)
  2. 110110 0 000100010 — десятый бит (справа) нулевой, значит первый суррогат
  3. 110111 1 010001000 — десятый бит (справа) единица, значит второй суррогат
  4. отбрасываем по 6 бит отвечающих за определение суррогата, получим 0000100010 1010001000 (8A88)
  5. прибавляем 10000 (меньшее число суррогатного диапазона) 8A88 + 10000 = 18A88
  6. смотрим в таблице юникода символ U+18A88 = Tangut Component-649. Компоненты тангутского письма.

Вот некоторые интересные ссылки по данной теме:
habr.com/ru/post/158895 — полезные общие сведения по кодировкам
habr.com/ru/post/312642 — про юникод
unicode-table.com/ru — сама таблица юникод символов

FAQ: Как проверить кодировку в текстовом файле?

Программный комплекс SocialKit корректно работает с кириллицей в текстовых файлах, кодировка которых соответствует стандарту Windows-1251 (кратко может быть записано как CP1251 или ANSI). В этой связи в задачах, поддерживающих указание внешнего файла с перечнем комментариев, сообщений, описаний и прочей информации, которая может содержать кириллицу, нужно указывать текстовые файлы, где русский текст задан в кодировке по стандарту Windows-1251 или же просто ANSI, или CP1251 — всё это, по сути, одно и то же.

Учитывая, что многие инструменты по работе с текстом не отображают, в какой именно кодировке задан текст в текстовом файле и/или не поддерживают преобразование кодировок, то у новичков часто возникает вопрос о том, как именно привести кодировку текстового файла с русским текстом к понятному для SocialKit формату CP1251.

Следует сразу отметить, что большинство текстовых редакторов для ОС Windows (например, встроенный Блокнот и Wordpad) по умолчанию создают текстовые файлы именно с кодировкой по стандарту Windows-1251. Однако, эта кодировка по умолчанию может быть изменена в следствие тех или иных действий.

Если вы не уверены в том, в какой именно кодировке задан текст, то проще всего этот текст пересохранить через стандартный Блокнот Windows. При пересохранении Блокнот также покажет, в каком формате текст сейчас.

Опишем эту простую процедуру по шагам.

1. Открыть искомый текстовый файл в Блокноте Windows и выбрать пункт меню «Файл» -> «Сохранить как. «.

Пример текстового файла, в котором русский текст задан в формате UTF, но это не очевидно при открытии.

2. В открывшемся диалоговом окне вы сразу видите, в какой кодировке был сохранён текст в текстовом файле.

Диалоговое окно пересохранения текстового файла, в котором можно сразу изменить кодировку.

Как видно, в примере текст в текстовом файле был ранее сохранён в кодировке UTF-8. Для изменения кодировке достаточно выбрать в выпадающем списке кодировку ANSI и нажать кнопку «Сохранить«.

При этом зрительно для вас ничего не изменится, но многое изменится для программы и алгоритмов, занимающихся обработкой текста в процессе отправки. Корректно Instagram’у будет отправлен только ANSI-текст.

Выбор кодировки текста при открытии и сохранении файлов

Как правило, при совместной работе с текстовыми файлами нет необходимости вникать в технические аспекты хранения текста. Однако если необходимо поделиться файлом с человеком, который работает с текстами на других языках, скачать текстовый файл из Интернета или открыть его на компьютере с другой операционной системой, может потребоваться задать кодировку при его открытии или сохранении.

Когда вы открываете текстовый файл в Microsoft Word или другой программе (например, на компьютере, язык операционной системы на котором отличается от того, на котором написан текст в файле), кодировка помогает программе определить, в каком виде нужно вывести текст на экран, чтобы его можно было прочитать.

В этой статье

  • Общие сведения о кодировке текста
  • Выбор кодировки при открытии файла
  • Выбор кодировки при сохранении файла
  • Поиск кодировок, доступных в Word

Общие сведения о кодировке текста

То, что отображается на экране как текст, фактически хранится в текстовом файле в виде числового значения. Компьютер преобразует числические значения в видимые символы. Для этого используется кодикон.

Кодировка — это схема нумерации, согласно которой каждому текстовому символу в наборе соответствует определенное числовое значение. Кодировка может содержать буквы, цифры и другие символы. В различных языках часто используются разные наборы символов, поэтому многие из существующих кодировок предназначены для отображения наборов символов соответствующих языков.

Различные кодировки для разных алфавитов

Сведения о кодировке, сохраняемые с текстовым файлом, используются компьютером для вывода текста на экран. Например, в кодировке «Кириллица (Windows)» знаку «Й» соответствует числовое значение 201. Когда вы открываете файл, содержащий этот знак, на компьютере, на котором используется кодировка «Кириллица (Windows)», компьютер считывает число 201 и выводит на экран знак «Й».

Однако если тот же файл открыть на компьютере, на котором по умолчанию используется другая кодировка, на экран будет выведен знак, соответствующий числу 201 в этой кодировке. Например, если на компьютере используется кодировка «Западноевропейская (Windows)», знак «Й» из исходного текстового файла на основе кириллицы будет отображен как «É», поскольку именно этому знаку соответствует число 201 в данной кодировке.

Юникод: единая кодировка для разных алфавитов

Чтобы избежать проблем с кодированием и декодированием текстовых файлов, можно сохранять их в Юникоде. В состав этой кодировки входит большинство знаков из всех языков, которые обычно используются на современных компьютерах.

Так как Word работает на базе Юникода, все файлы в нем автоматически сохраняются в этой кодировке. Файлы в Юникоде можно открывать на любом компьютере с операционной системой на английском языке независимо от языка текста. Кроме того, на таком компьютере можно сохранять в Юникоде файлы, содержащие знаки, которых нет в западноевропейских алфавитах (например, греческие, кириллические, арабские или японские).

Выбор кодировки при открытии файла

Если в открытом файле текст искажен или выводится в виде вопросительных знаков либо квадратиков, возможно, Word неправильно определил кодировку. Вы можете указать кодировку, которую следует использовать для отображения (декодирования) текста.

  1. Откройте вкладку Файл.
  2. Нажмите кнопку Параметры.
  3. Нажмите кнопку Дополнительно.
  4. Перейдите к разделу Общие и установите флажокПодтверждать преобразование формата файла при открытии.

Примечание: Если установлен этот флажок, Word отображает диалоговое окно Преобразование файла при каждом открытии файла в формате, отличном от формата Word (то есть файла, который не имеет расширения DOC, DOT, DOCX, DOCM, DOTX или DOTM). Если вы часто работаете с такими файлами, но вам обычно не требуется выбирать кодировку, не забудьте отключить этот параметр, чтобы это диалоговое окно не выводилось.

Если почти весь текст выглядит одинаково (например, в виде квадратов или точек), возможно, на компьютере не установлен нужный шрифт. В таком случае можно установить дополнительные шрифты.

Чтобы установить дополнительные шрифты, сделайте следующее:

  1. Нажмите кнопку Пуск и выберите пункт Панель управления.
  2. Выполните одно из указанных ниже действий. В Windows 7
    1. На панели управления выберите раздел Удаление программы.
    2. В списке программ щелкните Microsoft Office или Microsoft Word, если он был установлен отдельно от пакета Microsoft Office, и нажмите кнопку Изменить.

    В Windows Vista

    1. На панели управления выберите раздел Удаление программы.
    2. В списке программ щелкните Microsoft Office или Microsoft Word, если он был установлен отдельно от пакета Microsoft Office, и нажмите кнопку Изменить.

    В Windows XP

    1. На панели управления щелкните элемент Установка и удаление программ.
    2. В списке Установленные программы щелкните Microsoft Office или Microsoft Word, если он был установлен отдельно от пакета Microsoft Office, и нажмите кнопку Изменить.

    Совет: При открытии текстового файла в той или иной кодировке в Word используются шрифты, определенные в диалоговом окне Параметры веб-документа. (Чтобы вызвать диалоговое окно Параметры веб-документа, нажмите кнопку Microsoft Office, затем щелкните Параметры Word и выберите категорию Дополнительно. В разделе Общие нажмите кнопку Параметры веб-документа.) С помощью параметров на вкладке Шрифты диалогового окна Параметры веб-документа можно настроить шрифт для каждой кодировки.

    Выбор кодировки при сохранении файла

    Если не выбрать кодировку при сохранении файла, будет использоваться Юникод. Как правило, рекомендуется применять Юникод, так как он поддерживает большинство символов большинства языков.

    Если документ планируется открывать в программе, которая не поддерживает Юникод, вы можете выбрать нужную кодировку. Например, в операционной системе на английском языке можно создать документ на китайском (традиционное письмо) с использованием Юникода. Однако если такой документ будет открываться в программе, которая поддерживает китайский язык, но не поддерживает Юникод, файл можно сохранить в кодировке «Китайская традиционная (Big5)». В результате текст будет отображаться правильно при открытии документа в программе, поддерживающей китайский язык (традиционное письмо).

    Примечание: Так как Юникод — это наиболее полный стандарт, при сохранении текста в других кодировках некоторые знаки могут не отображаться. Предположим, например, что документ в Юникоде содержит текст на иврите и языке с кириллицей. Если сохранить файл в кодировке «Кириллица (Windows)», текст на иврите не отобразится, а если сохранить его в кодировке «Иврит (Windows)», то не будет отображаться кириллический текст.

    Если выбрать стандарт кодировки, который не поддерживает некоторые символы в файле, Word пометит их красным. Вы можете просмотреть текст в выбранной кодировке перед сохранением файла.

    При сохранении файла в виде кодированного текста из него удаляется текст, для которого выбран шрифт Symbol, а также коды полей.

    Выбор кодировки

    1. Откройте вкладку Файл.
    2. Выберите пункт Сохранить как. Чтобы сохранить файл в другой папке, найдите и откройте ее.
    3. В поле Имя файла введите имя нового файла.
    4. В поле Тип файла выберите Обычный текст.
    5. Нажмите кнопку Сохранить.
    6. Если появится диалоговое окно Microsoft Office Word — проверка совместимости, нажмите кнопку Продолжить.
    7. В диалоговом окне Преобразование файла выберите подходящую кодировку.
    8. Чтобы использовать стандартную кодировку, выберите параметр Windows (по умолчанию).
    9. Чтобы использовать кодировку MS-DOS, выберите параметр MS-DOS.
    10. Чтобы задать другую кодировку, установите переключатель Другая и выберите нужный пункт в списке. В области Образец можно просмотреть текст и проверить, правильно ли он отображается в выбранной кодировке.

    Примечание: Чтобы увеличить область отображения документа, можно изменить размер диалогового окна Преобразование файла.

    Поиск кодировок, доступных в Word

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

    Ниже приведен список письменностей и связанных с ними кодировок (кодовых страниц).

    Система письменности

    Используемый шрифт

    Юникод (UCS-2 с прямым и обратным порядком байтов, UTF-8, UTF-7)

    Стандартный шрифт для стиля «Обычный» локализованной версии Word

    Windows 1256, ASMO 708

    Китайская (упрощенное письмо)

    GB2312, GBK, EUC-CN, ISO-2022-CN, HZ

    Китайская (традиционное письмо)

    BIG5, EUC-TW, ISO-2022-TW

    Windows 1251, KOI8-R, KOI8-RU, ISO8859-5, DOS 866

    Английская, западноевропейская и другие, основанные на латинице

    Windows 1250, 1252-1254, 1257, ISO8859-x

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *