Как сделать кодировку unicode

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

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

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

В этой статье

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

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

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

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

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

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

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

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

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

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

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

Откройте вкладку Файл.

Перейдите к разделу Общие и установите флажокПодтверждать преобразование формата файла при открытии.

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

Закройте, а затем снова откройте файл.

В диалоговом окне Преобразование файла выберите пункт Кодированный текст.

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

В области Образец можно просмотреть текст и проверить, правильно ли он отображается в выбранной кодировке.

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

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

Выполните одно из указанных ниже действий.

В Windows 7

На панели управления выберите раздел Удаление программы.

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

В Windows Vista

На панели управления выберите раздел Удаление программы.

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

В Windows XP

На панели управления щелкните элемент Установка и удаление программ.

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

В группе Изменение установки Microsoft Office нажмите кнопку Добавить или удалить компоненты и затем нажмите кнопку Продолжить.

В разделе Параметры установки разверните элемент Общие средства Office, а затем — Многоязыковая поддержка.

Выберите нужный шрифт, щелкните стрелку рядом с ним и выберите пункт Запускать с моего компьютера.

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

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

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

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

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

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

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

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

Откройте вкладку Файл.

Выберите пункт Сохранить как.

Чтобы сохранить файл в другой папке, найдите и откройте ее.

В поле Имя файла введите имя нового файла.

В поле Тип файла выберите Обычный текст.

Если появится диалоговое окно Microsoft Office Word — проверка совместимости, нажмите кнопку Продолжить.

В диалоговом окне Преобразование файла выберите подходящую кодировку.

Чтобы использовать стандартную кодировку, выберите параметр Windows (по умолчанию).

Чтобы использовать кодировку MS-DOS, выберите параметр MS-DOS.

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

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

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

Если в выбранной кодировке нет эквивалентных знаков для символов, выделенных красным цветом, они будут сохранены как внеконтекстные (например, в виде вопросительных знаков).

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

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

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

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

В этом уроке мы рассмотрим, как кодировать строку в UTF-8 на Java – с помощью стандартных наборов символов, getBytes() с помощью ByteBuffer и Apache Commons с примерами.

Вступление

При работе со строками | в Java нам часто приходится кодировать их в определенную кодировку, такую как UTF-8 .

UTF-8 представляет собой кодировку символов переменной ширины, которая использует от одного до четырех восьмибитных байтов для представления всех допустимых кодовых точек Юникода .

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

UTF-8 использует один байт для представления кодовых точек из 0-127 , сделав первый 128 код указывает взаимно однозначную карту с символами ASCII, поэтому UTF-8 обратно совместим с ASCII.

Примечание: Java кодирует все строки в UTF-16, который использует минимум два байта для хранения кодовых точек. Зачем тогда нам нужно было бы конвертировать в UTF-8?

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

Мы будем работать с несколькими Строками , которые содержат символы Юникода , с которыми вы, возможно, не сталкиваетесь ежедневно, такие как č , β и あ , имитирующие ввод данных пользователем.

Давайте выпишем пару строк:

Теперь давайте воспользуемся Строкой(байт[] байт, кодировка кодировки) конструктором строки, чтобы воссоздать эти строки, но с другой кодировкой , имитирующей ввод ASCII , который поступил к нам в первую очередь:

Как только мы создадим эти строки и закодируем их в виде символов ASCII, мы сможем их распечатать:

В то время как первые две строки содержат всего несколько символов, которые не являются допустимыми символами ASCII, последняя строка не содержит никаких .

Чтобы избежать этой проблемы, мы можем предположить, что не все входные данные уже могут быть закодированы по нашему вкусу – и закодировать их, чтобы самим решить такие случаи. Существует несколько способов кодирования строки в UTF-8 на Java.

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

Использование метода getBytes()

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

По умолчанию, без указания кодировки , байты кодируются с использованием платформы по умолчанию Кодировки – которая может не быть UTF-8 или UTF-16. Давайте возьмем байты строки и распечатаем их:

Это кодовые точки для наших закодированных символов, и они не очень полезны для человеческих глаз. Хотя, опять же, мы можем использовать конструктор String для создания удобочитаемой строки из этой самой последовательности. Учитывая тот факт , что мы закодировали этот массив байтов в UTF_8 , мы можем продолжить и безопасно создать новую строку из этого:

Примечание: Вместо того, чтобы кодировать их с помощью метода getBytes () , вы можете также кодировать байты с помощью конструктора строк:

Теперь выводится та же самая строка, с которой мы начали, но закодированная в UTF-8:

Кодируйте строку в UTF-8 с помощью стандартных наборов символов Java 7

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Начиная с Java 7 , мы познакомились с классом Стандартные наборы символов , в котором доступно несколько наборов символов , таких как US_ASCII , ISO_8859_1 , UTF_8 и UTF-16 среди прочих.

Каждая Кодировка имеет кодирование() и декодирование() метод, который принимает Буфер символов (который реализует последовательность символов , такую же, как Строка ). С практической точки зрения – это означает, что мы можем вставить строку в encode() методы кодировки .

Метод encode() возвращает ByteBuffer , который мы можем легко снова превратить в строку.

Ранее, когда мы использовали наш метод getBytes () , мы сохраняли полученные байты в массиве байтов, но при использовании класса StandardCharsets все немного по-другому. Сначала нам нужно использовать класс ByteBuffer для хранения наших байтов. Затем нам нужно как кодировать , так и декодировать обратно наши недавно выделенные байты. Давайте посмотрим, как это работает в коде:

Выполнение этого кода приводит к:

Закодируйте строку в UTF-8 с помощью Apache Commons

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

Чтобы мы могли использовать кодек Apache Commons, нам нужно добавить его в наш проект в качестве внешней зависимости.

Используя Maven, давайте добавим зависимость commons-кодек в ваш pom.xml файл:

В качестве альтернативы, если вы используете Gradle:

Теперь мы можем использовать служебные классы Apache Commons – и, как обычно, мы будем использовать класс StringUtils .

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

Для кодирования строки в UTF-8 с помощью класса StringUtils Apache Common мы можем использовать метод getBytes Utf 8 () , который работает так же, как метод getBytes() с указанной кодировкой :

Или , вы можете использовать обычный StringUtils класс из commons-lang3 зависимости:

Если вы используете Gradle:

И теперь мы можем использовать почти тот же подход, что и с обычными строками:

Благодаря этому подход является потокобезопасным и нулевым:

Вывод

В этом уроке мы рассмотрели как кодировать строку Java в UTF-8 . Мы рассмотрели несколько подходов – ручное создание строки с использованием getBytes() и управление ими, класс Java 7 Стандартные наборы символов , а также Apache Commons.

В этом HOWTO обсуждается поддержка Python спецификации Юникод для представления текстовых данных и объясняются различные проблемы, с которыми люди обычно сталкиваются при работе с Юникод.

Знакомство с Юникодом¶

Определения¶

Стандарт Юникод описывает, как символы представлены кодовыми точками. Значение кодовой точки — это целое число в диапазоне от 0 до 0x10FFFF (около 1.1 миллиона значений, из которых на данный момент присвоено около 110 тысяч). В стандарте и в этом документе кодовая точка записывается с использованием обозначения U+265E для обозначения символа со значением 0x265e (9822 в десятичной системе).

Стандарт Юникод содержит множество таблиц, в которых перечислены символы и соответствующие им кодовые точки:

Символ представлен на экране или на бумаге набором графических элементов, который называется глифом. Например, глиф для прописной буквы A представляет собой два диагональных штриха и горизонтальный штрих, хотя точные детали будут зависеть от используемого шрифта. Большинству кода Python не нужно беспокоиться о глифах; определение правильного глифа для отображения, как правило, является задачей инструментария графического интерфейса пользователя или средства визуализации шрифтов терминала.

Кодировки¶

Это простое представление, но при его использовании возникает ряд проблем.

  1. Непереносимая; разные процессоры по-разному упорядочивают байты.
  2. Она занимает очень много места. В большинстве текстов большинство кодовых точек меньше 127 или меньше 255, поэтому много места занимают байты 0x00 . Вышеупомянутая строка занимает 24 байта по сравнению с 6 байтами, необходимыми для представления ASCII. Повышенное использование ОЗУ не имеет большого значения (настольные компьютеры имеют гигабайты ОЗУ, а строки обычно не такие большие), но увеличение использования диска и пропускной способности сети в 4 раза недопустимо.
  3. Она несовместима с существующими функциями C, такими как strlen() , поэтому необходимо использовать новое семейство широких строковых функций.

Поэтому эта кодировка используется не очень часто, и люди вместо этого выбирают другие кодировки, более эффективные и удобные, например UTF-8.

  1. Если кодовая точка = 128, она превращается в последовательность из двух, трёх или четырёх байтов, где каждый байт последовательности находится между 128 и 255.

У UTF-8 есть несколько удобных свойств:

Ссылки¶

Сайт Консорциума Юникода содержит символьные таблицы, глоссарий и PDF-версии спецификации. Будьте готовы к трудному чтению. Хронология происхождения и развития Юникод также доступен на сайте.

На канале Computerphile Youtube Том Скотт кратко обсуждает историю Юникод и UTF-8 (9 минут 36 секунд).

Чтобы помочь понять стандарт, Юкка Корпела написал вводное руководство для чтения таблиц символов Юникод.

Другая хорошая вступительная статья написал Джоэл Спольски. Если это введение не прояснило вам ситуацию, вам следует попробовать прочитать альтернативную статью, прежде чем продолжить.

Поддержка Юникода в Python¶

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

Строковый тип¶

Начиная с Python 3.0, тип языка str содержит символы Юникод, что означает любую строку, созданную с использованием "unicode rocks!" , 'unicode rocks!' или сохраняется строковый синтаксис с тройными кавычками как Юникод.

Кодировка по умолчанию для исходного кода Python — UTF-8, поэтому вы можете просто включить символ Юникод в строковый литерал:

Примечание: Python 3 также разрешает использование символов Юникод в идентификаторах:

Если вы не можете ввести определенный символ в своём редакторе или по какой-то причине хотите сохранить исходный код только в формате ASCII, вы также можете использовать escape-последовательности в строковых литералах. (В зависимости от вашей системы вы можете увидеть фактический глиф с заглавными буквами вместо экранирующего символа u.):

Кроме того, можно создать строку, используя метод decode() из bytes . Метод принимает аргумент encoding, например UTF-8, и, необязательно, аргумент errors.

Аргумент errors указывает ответ, когда входная строка не может быть преобразована в соответствии с правилами кодирования. Допустимые значения этого аргумента: 'strict' (вызвать исключение UnicodeDecodeError ), 'replace' (использовать U+FFFD , СИМВОЛ ЗАМЕНЫ ), 'ignore' (просто исключить символ из результата Юникод) или 'backslashreplace' (вставить escape-последовательность \xNN ). Следующие примеры показывают различия:

Кодировки задаются как строки, содержащие имя кодировки. У Python около 100 различных кодировок; см. список в справочнике по библиотеке Python в стандартные кодировки . Некоторые кодировки имеют несколько имён; например: 'latin-1' , 'iso_8859_1' и '8859 — все синонимы для одной и той же кодировки.

Односимвольные Юникод строки также могут быть созданы с помощью встроенной функции chr() , которая принимает целые числа и возвращает Юникод строку длиной 1, содержащую соответствующую кодовую точку. Обратной операцией является встроенная функция ord() , которая принимает односимвольную строку Юникод и возвращает значение кодовой точки:

Преобразование в байты¶

Метод, противоположный bytes.decode() — str.encode() , который возвращает bytes представление строки Юникод, закодированной в запрошенной кодировке.

Параметр errors такой же, как параметр метода decode() , но поддерживает ещё несколько возможных обработчиков. Помимо 'strict' , 'ignore' и 'replace' (который в данном случае вставляет вопросительный знак вместо некодируемого символа), существует также 'xmlcharrefreplace' (вставляет ссылку на символ XML), backslashreplace (вставляет escape- последовательность \uNNNN ) и namereplace (вставляет escape- последовательность) \N<. >` escape-последовательность).

В следующем примере показаны разные результаты:

Подпрограммы низкого уровня для регистрации и доступа к доступным кодировкам находятся в модуле codecs . Реализация новых кодировок также требует понимания модуля codecs . Однако функции кодирования и декодирования, возвращаемые этим модулем, обычно более низкоуровневые, чем это удобно, а написание новых кодировок — это специализированная задача, поэтому модуль не будет рассматриваться в этом HOWTO.

Литералы Юникода в исходном коде Python¶

В исходном коде Python определенные кодовые точки Юникод могут быть записаны с использованием escape-последовательности \u , за которой следуют четыре шестнадцатеричные цифры, дающие кодовую точку. Управляющая последовательность \U аналогична, но предполагает восемь шестнадцатеричных цифр, а не четыре:

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

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

Если вы не добавите такой комментарий, по умолчанию будет использоваться кодировка UTF-8, как уже упоминалось. См. также PEP 263 для получения дополнительной информации.

Свойства Юникода¶

Спецификация Юникод включает базу данных с информацией о кодовых точках. Для каждой определенной кодовой точки информация включает имя символа, его категорию, числовое значение, если применимо (для символов, представляющих числовые понятия, такие как римские цифры, дроби, такие как одна треть и четыре пятых и т. д.). Есть также свойства, связанные с отображением, например, как использовать кодовую точку в двунаправленном тексте.

Следующая программа отображает некоторую информацию о нескольких символах и печатает числовое значение одного конкретного символа:

При запуске печатает:

Сравнение строк¶

Вторым инструментом является функция normalize() модуля unicodedata , которая преобразует строки в одну из нескольких нормальных форм, где буквы, за которыми следует объединяющий символ, заменяются одиночными символами. normalize() можно использовать для выполнения сравнений строк, которые не будут ложно сообщать о неравенстве, если две строки по-разному используют комбинирующие символы:

При запуске выводит:

Первым аргументом функции normalize() является строка, дающая желаемую форму нормализации, которая может быть одной из NFC, NFKC, NFD и NFKD.

Стандарт Юникод также определяет, как проводить сравнения без регистра:

(Почему NFD() вызывается дважды? Поскольку есть несколько символов, которые заставляют casefold() возвращать ненормализованную строку, поэтому результат необходимо снова нормализовать. См. обсуждение и пример в разделе 3.13 стандарта Юникод.)

Регулярные выражения Юникод¶

Регулярные выражения, поддерживаемые модулем re , могут быть представлены в виде байтов или строк. Некоторые последовательности специальных символов, такие как \d и \w , имеют разные значения в зависимости от того, предоставляется ли шаблон в виде байтов или строки. Например, \d будет соответствовать категории символов 1 в байтах, но в строках будет соответствовать любому символу, который находится в 'Nd' категории.

Строка в этом примере будет числом 57, записанное как тайскими, так и арабскими цифрами:

Аналогично, \w соответствует большому количеству символов Юникод, но только в байтах [a-zA-Z0-9_] или, если указан re.ASCII , а \s будет соответствовать либо пробельным символам Юникод, либо [ \t\n\r\f\v] .

Ссылки¶

Есть несколько хороших альтернативных обсуждений поддержки Юникод в Python:

    , Ника Коглана. , презентация Неда Батчелдера на PyCon 2012.

Тип str описан в справочнике по библиотеке Python по адресу .

Документация к модулю unicodedata .

Документация к модулю codecs .

Чтение и запись данных Юникод¶

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

Возможно, вам не потребуется ничего делать в зависимости от ваших источников ввода и назначения вывода; вы должны проверить, поддерживают ли библиотеки, используемые в вашем приложении, Юникод изначально. Например, синтаксические анализаторы XML часто возвращают данные Юникод. Многие реляционные базы данных также поддерживают столбцы со значениями Юникод и могут возвращать значения Юникод из запроса SQL.

Одной из проблем является многобайтовый характер кодировок; один символ Юникод может быть представлен несколькими байтами. Если вы хотите читать файл фрагментами произвольного размера (скажем, 1024 или 4096 байтов), вам необходимо написать код обработки ошибок, чтобы уловить случай, когда только часть байтов, кодирующих один символ Юникод, читается в конце кусока. Одним из решений может быть считывание всего файла в память, а затем выполнение декодирования, но это мешает вам работать с файлами очень большого размера; если вам нужно прочитать файл размером 2 ГиБ, вам потребуется 2 ГиБ ОЗУ. (Более того, поскольку, по крайней мере, на мгновение вам понадобятся как закодированная строка, так и её версия Юникод в памяти.)

Решением будет использование низкоуровневого интерфейса декодирования, чтобы уловить случай частичных последовательностей кодирования. Работа по реализации этого уже была сделана за вас: встроенная функция open() может возвращать файловый объект, который предполагает, что содержимое файла находится в указанной кодировке, и принимает параметры Юникод для таких методов, как read() и write() . Это работает через параметры encoding и errors open() , которые интерпретируются так же, как в str.encode() и bytes.decode() .

Поэтому читать Юникод из файла очень просто:

Также можно открывать файлы в режиме обновления, позволяя читать и писать:

Имена файлов в Юникоде¶

Большинство широко используемых сегодня операционных систем поддерживают имена файлов, содержащие произвольные символы Юникод. Обычно это реализуется путём преобразования строки Юникод в некоторую кодировку, которая зависит от системы. Сегодня Python все больше и больше использует UTF-8: Python в MacOS использовал UTF-8 для нескольких версий, а Python 3.6 также перешёл на использование UTF-8 в Windows. В системах Unix кодировка файловой системы будет только в том случае, если вы установили переменные среды LANG или LC_CTYPE ; если нет, кодировка по умолчанию снова UTF-8.

Функция sys.getfilesystemencoding() возвращает кодировку для использования в вашей текущей системе, если вы хотите выполнить кодирование вручную, но нет особых причин для беспокойства. При открытии файла для чтения или записи вы обычно можете просто указать строку Юникод в качестве имени файла, и она будет автоматически преобразована в нужную для вас кодировку:

Функции модуля os , такие как os.stat() , также принимают имена файлов Юникод.

Функция os.listdir() возвращает имена файлов, что вызывает вопрос: должна ли она возвращать версию имен файлов в формате Юникод или должна возвращать байты, содержащие закодированные версии? os.listdir() может делать и то, и другое, в зависимости от того, предоставили ли вы путь к каталогу в байтах или в строке Юникод. Если вы передадите строку Юникод в качестве пути, имена файлов будут декодированы с использованием кодировки файловой системы, и будет возвращен список строк Юникод, а передача байтового пути вернёт имена файлов в байтах. Например, предполагая, что кодировка файловой системы по умолчанию — UTF-8, запустите следующую программу:

вернёт следующий результат:

Первый список содержит имена файлов в кодировке UTF-8, а второй список содержит версии Юникод.

Обратите внимание, что в большинстве случаев вы можете просто использовать Юникод с этими API. API байтов следует использовать только в системах, где могут присутствовать недекодируемые имена файлов; сейчас это в основном только системы Unix.

Советы по написанию программ с поддержкой Юникод¶

В этом разделе представлены некоторые предложения по написанию программного обеспечения, работающего с Юникод.

Самый важный совет:

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

Если вы попытаетесь написать функции обработки, которые принимают как Юникод, так и байтовые строки, вы обнаружите, что ваша программа уязвима для ошибок везде, где вы комбинируете два разных типа строк. Нет автоматического кодирования или декодирования: если вы это сделаете, например, str + bytes , будет поднято TypeError .

При использовании данных, поступающих из веб-браузера или другого ненадежного источника, распространенным методом является проверка на недопустимые символы в строке перед использованием строки в сгенерированной командной строке или сохранением её в базе данных. Если вы делаете это, будьте осторожны и проверяйте декодированную строку, а не закодированные байтовые данные; некоторые кодировки могут иметь интересные свойства, например, не быть биективными или не быть полностью совместимыми с ASCII. Это особенно верно, если во входных данных также указана кодировка, поскольку злоумышленник может выбрать хитрый способ скрыть вредоносный текст в закодированном байтовом потоке.

Преобразование между кодировками файлов¶

Класс StreamRecoder может прозрачно преобразовывать между кодировками, принимая поток, который возвращает данные в кодировке №1, и ведёт себя как поток, возвращающий данные в кодировке №2.

Например, если у вас есть входной файл f в Latin-1, вы можете обернуть его StreamRecoder , чтобы вернуть байты в кодировке UTF-8:

Файлы в неизвестной кодировке¶

Что делать, если вам нужно внести изменения в файл, но вы не знаете его кодировку? Если вы знаете, что кодировка совместима с ASCII, и хотите проверить или изменить только части ASCII, вы можете открыть файл с помощью обработчика ошибок surrogateescape :

Обработчик ошибок surrogateescape декодирует любые байты, отличные от ASCII, как кодовые точки в специальном диапазоне от U+DC80 до U+DCFF. Затем эти кодовые точки снова превратятся в те же байты, когда обработчик ошибок surrogateescape используется для кодирования данных и их обратной записи.

Ссылки¶

Одна секция Освоение Ввода-Вывода Python 3, речь на PyCon 2010 Дэвидом Бизли, обсуждает текстовую обработку и обработку двоичных данных.

Сила Юникода в Python - это выступление Бенджамина Питерсона на PyCon 2013, в котором обсуждается внутреннее представление Юникода в Python 3.3.

Благодарности¶

Первоначальный черновик этого документа был написан Эндрю Кучлингом. С тех пор он был переработан Александром Белопольским, Георгом Брандлом, Эндрю Кучлингом и Эцио Мелотти.

Благодарим следующих людей, которые отметили ошибки или предложили предложения по этой статье: Эрик Араужо, Николас Бастин, Ник Коглан, Мариус Гедминас, Кент Джонсон, Кен Круглер, Марк-Андре Лембург, Мартин фон Лёвис, Терри дж. Риди, Сергей Сторчака, Эрик Сан, Чад Уитакр, Грэм Уайдман.

Как поменять кодировку в Word

MS Word заслужено является самым популярным текстовым редактором. Следовательно, чаще всего можно столкнуться с документами в формате именно этой программы. Все, что может в них отличаться, это лишь версия Ворда и формат файла (DOC или DOCX). Однако, не смотря на общность, с открытием некоторых документов могут возникнуть проблемы.

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

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

Примечание: Общепринятые стандарты кодировки текста в разных странах могут отличаться. Вполне возможно, что документ, созданный, к примеру, пользователем, проживающим в Азии, и сохраненный в местной кодировке, не будет корректно отображаться у пользователя в России, использующего на ПК и в Word стандартную кириллицу.

Что такое кодировка

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

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

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

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

1. Откройте меню “Файл” (кнопка “MS Office” ранее).

Кнопка файл в Word

2. Откройте раздел “Параметры” и выберите в нем пункт “Дополнительно”.

Параметры в Word

3. Прокрутите содержимое окна вниз, пока не найдете раздел “Общие”. Установите галочку напротив пункта “Подтверждать преобразование формата файла при открытии”. Нажмите “ОК” для закрытия окна.

Параметры Дополнительно в Word

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

Параметры Общие ОК в Word

4. Закройте файл, а затем снова откройте его.

5. В разделе “Преобразование файла” выберите пункт “Кодированный текст”.

6. В открывшемся диалоговом окне “Преобразование файла” установите маркер напротив параметра “Другая”. Выберите необходимую кодировку из списка.

Преобразование файла Другая кодировка в Word

    Совет: В окне “Образец” вы можете увидеть, как будет выглядеть текст в той или иной кодировке.

Преобразование файла в Word

7. Выбрав подходящую кодировку, примените ее. Теперь текстовое содержимое документа будет корректно отображаться.

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

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

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

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

Проблема лишь в том, что в случае, если данный документ будет открываться в программе, поддерживающей китайский, но не поддерживающей Юникод, куда правильнее будет сохранить файл в другой кодировке, например, “Китайская традиционная (Big5)”. В таком случае текстовое содержимое документа при открытии его в любой программе с поддержкой китайского языка, будет отображаться корректно.

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

1. Откройте файл, кодировку которого вам необходимо изменить.

Кнопка файл в Word

2. Откройте меню “Файл” (кнопка “MS Office” ранее) и выберите пункт “Сохранить как”. Если это необходимо, задайте имя файла.

Сохранить как в Word

3. В разделе “Тип файла” выберите параметр “Обычный текст”.

Сохранить как обычный текст в Word

Преобразование файла в Word

5. Выполните одно из следующих действий:

Преобразование файла Другая кодировка в Word

Преобразование файла красный текст в Word


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

6. Файл будет сохранен в выбранной вами кодировке в виде обычного текста (формат “TXT”).

txt в Word

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

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

Читайте также: