Разное

Кодировка символов unicode: ✔️ ❤️ ★ Таблица символов Юникода

Содержание

✔️ ❤️ ★ Таблица символов Юникода

Юникод

Юникод (по-английски Unicode) — это стандарт кодирования символов. Проще говоря, это таблица соответствия текстовых знаков (цифр, букв, элементов пунктуации) двоичным кодам. Компьютер понимает только последовательность нулей и единиц. Чтобы он знал, что именно должен отобразить на экране, необходимо присвоить каждому символу свой уникальный номер. В восьмидесятых, знаки кодировали одним байтом, то есть восемью битами (каждый бит это 0 или 1). Таким образом получалось, что одна таблица (она же кодировка или набор) может вместить только 256 знаков. Этого может не хватить даже для одного языка. Поэтому, появилось много разных кодировок, путаница с которыми часто приводила к тому, что на экране вместо читаемого текста появлялись какие-то странные кракозябры. Требовался единый стандарт, которым и стал Юникод. Самая используемая кодировка — UTF-8 (Unicode Transformation Format) для изображения символа задействует от 1 до 4 байт.

Символы

Символы в таблицах Юникода пронумерованы шестнадцатеричными числами. Например, кириллическая заглавная буква М обозначена U+041C. Это значит, что она стоит на пересечении строки 041 и столбца С. Её можно просто скопировать и потом вставить куда-либо. Чтобы не рыться в многокилометровом списке следует воспользоваться поиском. Зайдя на страницу символа, вы увидите его номер в Юникоде и способ начертания в разных шрифтах. В строку поиска можно вбить и сам знак, даже если вместо него отрисовывается квадратик, хотя бы для того, чтобы узнать, что это было. Ещё, на этом сайте есть специальные (и не специальные — случайные) наборы однотипных значков, собранные из разных разделов, для удобства их использования.

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

Сам консорциум Юникода не изобретает новых символов. В таблицы добавляются те значки, которые находят своё применение в обществе. Например, активно использовался в течении шести лет прежде чем был добавлен в Юникод. Пиктограммы эмодзи (смайлики) тоже сначала получили широкое применение в Япониии прежде чем были включены в кодировку. А вот товарные знаки, и логотипы компаний не добавляются принципиально. Даже такие распространённые как яблоко Apple или флаг Windows. На сегодняшний день, в версии 8.0 закодировано около 120 тысяч символов.

Получить коды символов UTF-8 из строки Python unicode

Я читаю строку из командной строки, которая, как я знаю, на корейском языке закодирована как UTF-8. Я получаю строку, Выполнив такую команду

<my_command> | od -t x1

что дает мне:

0000000 ec a7 80 ec 97 ad 2f ea b5 ad ea b0 80 0a
0000016

С шестью символами UTF-8, равными {eca780}{ec97ad}{2f}{eab5ad}{eab080}{0a} , а затем я прочитал его в Python, используя

utf8_str = unicode(text_from_the_cl, encoding='utf-8')

Что я просто хочу сделать, так это иметь возможность видеть строку, которую я прочитал, в терминах кодов UTF-8 для символов, которые я прочитал. Так что что-то вроде \uc9c0\uc5ed/\uad6d\uac00 было бы хорошо. Это делается только для того, чтобы проверить, правильно ли они читаются.

( Я должен также указать, что это Python 2.6.x — над которым я не имею никакого контроля )

python

encoding

utf-8

python-2.6

Поделиться

Источник


Component 10    

12 августа 2014 в 13:55

2 ответа


  • Преобразование последовательности utf-8 unicode в utf-8 символов в Python 3

    Я читаю данные из корзины aws s3, в которой есть unicode символов, экранированных с помощью двойной обратной косой черты. Двойные обратные косые черты делают последовательность unicode анализируемой как серия символов utf-8 вместо символа, который представляет unicode. Пример иллюстрирует…

  • Python unicode строка с UTF-8?

    Я возвращаюсь из библиотеки, которая выглядит как неправильная строка unicode: >>> title u’Sopet\xc3\xb3n’ Теперь эти два hex побега есть кодировка UTF-8 для U+00F3 Латинской маленькой буквы O с острым. Насколько я понимаю, строка unicode в Python должна иметь фактический символ, а не…



1

Если вы хотите проверить содержимое строки unicode , используйте функцию repr() :

>>> from binascii import unhexlify
>>> unhexlify(''.join('ec a7 80 ec 97 ad 2f ea b5 ad ea b0 80 0a'.split()))
'\xec\xa7\x80\xec\x97\xad/\xea\xb5\xad\xea\xb0\x80\n'
>>> print unhexlify(''.join('ec a7 80 ec 97 ad 2f ea b5 ad ea b0 80 0a'.split())).decode('utf8')
지역/국가

>>> print repr(unhexlify(''.join('ec a7 80 ec 97 ad 2f ea b5 ad ea b0 80 0a'.split())).decode('utf8'))
u'\uc9c0\uc5ed/\uad6d\uac00\n'

Результат repr() для значения unicode использует escape-последовательности \uhhhh для кодовых точек не-ASCII и не-Latin1; для кодовых точек Latin 1 и для непечатаемых символов используются escape-последовательности \xhh .

Поделиться


Martijn Pieters    

12 августа 2014 в 14:07



1

Используйте метод encode :

utf8_str.encode('utf8')

Обратите внимание, что utf8_str -это не очень хорошее имя для переменной. Исходная последовательность байтов использует кодировку UTF-8 для представления символов Юникода; вызов unicode «decodes» преобразует их в фактические кодовые точки Юникода. Чтобы вернуть байты обратно, вы просто перекодируете кодовые точки на UTF-8.

Поделиться


chepner    

12 августа 2014 в 14:06


Похожие вопросы:

Unicode против UTF-8 путаница в Python / Django?

Я наткнулся на этот отрывок в учебнике Django : Django models есть метод STR умолчанию () что звонки unicode () и преобразует результат в UTF-8 bytestring. Это означает, что unicode(p) вернет строку…

Могу ли я получить одну каноническую строку UTF-8 из строки Unicode?

У меня есть программа twelve-year-old Windows. Как может быть очевидно для знающих, он был разработан для ASCII символов, а не Unicode. Большая часть его была преобразована, но есть одно место,…

Зарезервированные коды символов в Unicode

Почему Unicode имеет несколько зарезервированных кодов символов? См. Unicode для двух языков- Каннада и тамильский . Оба языка очень старые, и я думаю, что нет никаких шансов получить новые символы…

Преобразование последовательности utf-8 unicode в utf-8 символов в Python 3

Я читаю данные из корзины aws s3, в которой есть unicode символов, экранированных с помощью двойной обратной косой черты. Двойные обратные косые черты делают последовательность unicode анализируемой…

Python unicode строка с UTF-8?

Я возвращаюсь из библиотеки, которая выглядит как неправильная строка unicode: >>> title u’Sopet\xc3\xb3n’ Теперь эти два hex побега есть кодировка UTF-8 для U+00F3 Латинской маленькой. ..

Хранение строки unicode UTF-8 в std::string

В ответ на дискуссию в Кросс-платформенные строки (и Unicode) в C++ Как работать с Unicode строками в C/C++ кросс-платформенным дружественным способом? Я пытаюсь присвоить строку UTF-8 переменной…

Как понять unicode и utf-8

Я прочитал unicode how-to из python docs и unicode tutorial из w3schools, но мне все еще неясно, как преобразовать строки в unicode и кодировки типа utf-8. Я понимаю, что в кодировках и кодировках…

Python sys.argv utf-8 — unicode не работает

У меня есть следующий код, который действует очень странно. Когда я делаю следующее, utf-8 красиво преобразуется в unicode. print…

Как я могу получить значение utf-8 int символа unicode из строки (w)?

Ситуация Мне нужна функция, которая ожидает строку и кодирует все символы, отличные от ascii, в utf-8 как шестнадцатеричное число и заменяет его этим. Например, ӷ в слове типа djvӷdio следует. ..

Преобразование unicode специальных символов в UTF-8

У меня есть проблема с преобразованием unicode символов в utf-8. Вот мой код: <?php $unicode = ‘\u0411. \u0426\u044d\u0446\u044d\u0433\u0441\u04af\u0440\u044d\u043d’; $utf8string =…

Unicode [АйТи бубен]

Unicode: UTF-8, UTF-16, UTF-32.

Юникод представляет собой набор графических символов и способ их кодирования для компьютерной обработки текстовых данных.

Юникод не только приписывает каждому символу уникальный код, но и определяет различные характеристики этого символа, например:

UTF-16: В Windows настройка, ускорение, частые вопросы Vista для представления всех Unicode- символов используется кодировка UTF-16. В UTF-16 символы представлены двумя байтами (16 битами). Эта кодировка используется в Windows, поскольку 16-битными значениями можно представить символы, составляющие алфавиты большинства языков мира, это позволяет программам быстрее обрабатывать строки и вычислять их длину. Однако для представления символов алфавита некоторых языков 16 бит недостаточно. Для таких случаев UTE-16 поддерживает «суррогатные» кодировки, позволяющие кодировать символы 32 битами (4 байтами). Впрочем, приложений, которым приходится иметь дело с символами таких языков, мало, поэтому UTF-16 — хороший компромисс между экономией памяти и простотой программирования. Заметьте, что в .NET Framework все символы кодируются с использованием UTF-16, поэтому применение UTF-16 в Windows- приложениях повышает производительность и снижает потребление памяти при передаче строк между «родным» и управляемым кодом.

UTF-8: В кодировке UTF-8 разные символы могут быть представлены 1,2,3 или 4 байтами. Символы с значениями меньше 0x0080 сжимаются до 1 байта, что очень удобно для символов, применяемых в США. Символы, которым соответствуют значения из диапазона 0x0080-0x07FF, преобразуются в 2-байтовые значения, что хорошо работает с алфавитами европейских и ближневосточных языков. Символы с бо́льшими значениями преобразуются в 3-байтовые значения, удобные при работе со среднеазиатскими языками. Наконец, «суррогатные» пары записываются в 4-байтовом формате. UTF-8— чрезвычайно популярная кодировка. Однако ее эффективность меньше по сравнению с UTF-16, если часто используются символы с значениями 0x0800 и выше.

UTF-32: В UTF-32 все символы представлены 4 байтами. Эта кодировка удобна для написания простых алгоритмов для перебора символов любого языка, не требующих обработки символов, представленных разным числом байтов. Например, при использовании UTF-32 можно забыть о «суррогатах», поскольку любой символ в этой кодировке представлен 4 байтами. Ясно, что с точки зрения использования памяти эффективность UTF-32 далека от идеала. Поэтому данную кодировку редко применяют для передачи строк по сети и сохранения их в файлы. Как правило, UTF-32 используется как внутренний формат представления данных в программе.

В ближайшее время все более важную роль будет играть особый формат Unicode (и ISO 10646) под названием UTF-8. Эта «производная» кодировка пользуется для записи символов цепочками байтов различной длины (от одного до шести), которые с помощью несложного алгоритма преобразуются в Unicode- коды, причем более употребительным символам соответствуют более короткие цепочки. Главное достоинство этого формата — совместимость с ASCII не только по значениям кодов, но и по количеству бит на символ, так как для кодирования любого из первых 128 символов в UTF-8 достаточно одного байта (хотя, например, для букв кириллицы нужно уже по два байта).

Формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9. Сейчас стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.

Для Web- дизайнера эта кодировка имеет особое значение, так как именно она объявлена «стандартной кодировкой документа» в HTML начиная с версии 4.

Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.

Проще говоря, в формате UTF-8 символы латинского алфавита, знаки препинания и управляющие символы ASCII записываются кодами US-ASCII, a все остальные символы кодируются при помощи нескольких октетов со старшим битом 1. Это приводит к двум эффектам.

Расшифровать или кодировать текст Unicode

Share

http://online-toolz. com/tools/text-unicode-entities-convertor.php

Unicode является стандартом вычислительной отрасли для последовательного кодирования, представления и обработки текста, выраженного в большинстве мировых систем письменности. Разработанная совместно со стандартом Universal Character Set и опубликованная в виде книги как The Unicode Standard, последняя версия Unicode состоит из репертуара из более чем 109 000 символов, охватывающих 93 скрипта, набора диаграмм кода для визуальной справки, методологии кодирования и набора стандартных кодировки символов, перечисление свойств символов, таких как верхний и нижний регистр, набор компьютерных файлов справочных данных и ряд связанных элементов, таких как свойства символов, правила нормализации, декомпозиции, сортировки, рендеринга и двунаправленного порядка отображения (для правильного отображения текст, содержащий как скрипты справа налево, такие как арабский и иврит, так и скрипты слева направо). Начиная с 2011 года, самой последней крупной версией Unicode является Unicode 6.0. Консорциум Unicode, некоммерческая организация, которая координирует разработку Unicode, имеет амбициозную цель в конечном итоге заменить существующие схемы кодирования символов Unicode и его стандартный формат преобразования Unicode (UTF) , поскольку многие из существующих схем ограничены по размеру и объему и несовместимы с многоязычными средами. Успех Unicode в унификации наборов символов привел к его широкому и преобладающему использованию в интернационализации и локализации компьютерного программного обеспечения. Стандарт был реализован во многих последних технологиях, включая XML, язык программирования Java, Microsoft .NET Framework и современные операционные системы.Unicode может быть реализован с помощью различных кодировок символов. Наиболее часто используемые кодировки являются UTF-8 (который использует один байт для любых символов ASCII, которые имеют одинаковые значения кода в кодировке UTF-8 и ASCII, и до четырех байт для других символов), теперь устаревший UCS-2 (который использует два байта для каждого символа, но не может кодировать каждый символ в текущем Стандарт Unicode) и UTF-16 (который расширяет UCS-2 для обработки кодовых точек за пределами UCS-2).


Source:

Wikipedia

AKA:

Ключевые слова: текст, HTML, сущности, конвертер, кодировка, символы, экранирование, декодирование, unescape, unicode, utf8, ascii

Когда «Zoë» !== «Zoë». Или зачем вам нужно нормализовать строки Unicode?

Никогда не слышал о нормализации Unicode? Ты не одинок. Но это избавит вас от многих неприятностей.

Рано или поздно, это поражает каждого разработчика:

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

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

На самом деле, хотя две приведенные выше строки на экране выглядят одинаково, способ их представления на диске, байты, сохраненные в файле, различны. В первом «Zoë» символ «ë» (e с умлаутом) представлял собой единую кодовую точку Unicode, а во втором случае он был в разложенном виде. Если вы имеете дело со строками Unicode в своем приложении, вы должны принять во внимание, что символы могут быть представлены несколькими способами.

Как мы добрались до смайликов: краткое объяснение кодировки символов

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

Первым из таких соглашений или кодировок символов был ASCII (американский стандартный код для обмена информацией). Он использует 7 бит и может представлять в общей сложности 128 символов, включая латинский алфавит (как в верхнем, так и в нижнем регистре), цифры и основные знаки пунктуации. Он также включает в себя набор «непечатных» символов, таких как перевод строки, табуляция, возврат каретки и т.д. Например, в стандарте ASCII буква M (заглавная буква m) кодируется как число 77 (4D в шестнадцатеричном формате).

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

Решение состояло в том, чтобы принять стандарт под названием Unicode с целью включения каждого символа каждого современного и исторического сценария, а также различных символов. Unicode 12.0 был выпущен всего несколько дней назад и содержит более 137 000 символов.

Юникод может быть реализован в нескольких стандартах кодирования символов. Наиболее распространенными являются UTF-8 и UTF-16; в сети UTF-8 значительно более популярен.

UTF-8 использует от 1 до 4 байтов для представления всех символов. Это расширенный набор ASCII, поэтому первые 128 символов идентичны символам в таблице ASCII. С другой стороны, UTF-16 использует от 2 до 4 байтов.

Зачем использовать оба? Западные языки, как правило, наиболее эффективно кодируются с помощью UTF-8 (поскольку большинство символов будут представлены только одним байтом), в то время как азиатские языки обычно могут создавать файлы меньшего размера при использовании UTF-16 в качестве кодировки.

Кодовые точки Unicode и кодировка символов

Каждому символу в стандарте Unicode присваивается идентификационный номер или кодовая точка. Например, смайлик собаки имеет кодовую точку U + 1F436.

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

  • UTF-8: 4 bytes, 0xF0 0x9F 0x90 0xB6
  • UTF-16: 4 bytes, 0xD83D 0xDC36

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

// Это включает в себя последовательность байтов в файле
console. log('🐶') // => 🐶
// Это использует кодовую точку Unicode (ES2015 и новее)
console.log('\u{1F436}') // => 🐶
// При этом используется представление UTF-16 с двумя кодовыми единицами (каждый из 2 байтов).
console.log('\uD83D\uDC36') // => 🐶

Большинство интерпретаторов JavaScript (включая Node.js и современные браузеры) используют UTF-16 для внутреннего использования. Это означает, что собачьи эмодзи хранятся с использованием двух кодовых единиц UTF-16 (по 16 бит каждая). Итак, это не должно вас удивлять

console.log('🐶'.length) // => 2

Объединение персонажей

Это возвращает нас к тому, что наши персонажи выглядят одинаково, но имеют разные представления.

Некоторые символы в кодировке Unicode объединяют символы, предназначенные для изменения других символов. Например:

  • n + ˜ = ñ
  • u + ¨ = ü
  • e + ´ = é

Не все комбинирующие символы добавляют диакритические знаки. Например, лигатуры позволяют присоединить ae к  æ, или ffi в .

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

Например, символ é может быть представлено с помощью:

  • Одна кодовая точка U + 00E9
  • Сочетание буквы e и острого акцента, в сумме две кодовые точки: U + 0065 и U + 0301

Два символа выглядят одинаково, но не сравниваются как одинаковые, а строки имеют разную длину. В JavaScript:

console.log('\u00e9') // => é
console.log('\u0065\u0301') // => é
console.log('\u00e9' == '\u0065\u0301') // => false
console.log('\u00e9'.length) // => 1
console.log('\u0065\u0301'.length) // => 2

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

Нормализующие строки

К счастью, есть простое решение, которое переводит строку в «каноническую форму».

Существует четыре стандартных формы нормализации:

  • NFC: Нормализация формы канонического состава
  • NFD: Нормализация формы канонического разложения
  • NFKC: Форма совместимости формы нормализации
  • NFKD: Разложение совместимости форм нормализации

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

JavaScript предлагает встроенный метод String.prototype.normalize([form]) с ES2015 (ранее известный как ES6), который теперь доступен в Node.js и во всех современных веб-браузерах. Аргументом является строка form, идентификатор формы нормализации, чтобы использовать, по умолчанию 'NFC'.

Вернемся к предыдущему примеру, но на этот раз нормализуем строку:

const str = '\u0065\u0301'
console.log(str == '\u00e9') // => false
const normalized = str.normalize('NFC')
console.log(normalized == '\u00e9') // => true
console.log(normalized.length) // => 1

TL; DR

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

С JavaScript вы можете использовать метод String.prototype.normalize(), который встроен в ES2015.

Ubuntu Manpage: UTF-8 — ASCII-совместимая многобайтная кодировка Unicode

Provided by: manpages-ru_0.98-4_all

НАИМЕНОВАНИЕ

       UTF-8 - ASCII-совместимая многобайтная кодировка Unicode

ОПИСАНИЕ

       Набор   символов  Unicode  покрывает  16-битное  пространство  кодов.   Наиболее  очевидная
       кодировка Unicode, известная как UCS-2, содержит последовательности 16-битных слов.  Такие
       строки  могут  содержать  комбинации  символов  (например  '\0'  или  '/'),  которые имеют
       специальное значение в именах файлов и других параметрах функций из  библиотеки  языка  C.
       Кроме  того,  большинство утилит UNIX предназначены для обработки ASCII-файлов, и не могут
       читать 16-битные символы без специальной модификации.  По  этим  причинам  UCS-2  является
       неподходящей  кодировкой Unicode в именах файлов, текстовых файлах, переменных окружения и
       т. д. Стандарт ISO 10646 Universal Character Set (UCS), являющийся надмножеством  Unicode,
       покрывает  уже  31-битное  пространство кодов, а используемая для него очевидная кодировка
       UCS-4 (последовательность 32-битных слов) имеет те же проблемы.

       Кодировка Unicode и UCS под названием UTF-8 лишена этих недостатков  и  являются  наиболее
       подходящей   для  использования  набора  символов  Unicode  в  Unix-подобных  операционных
       системах. 31 кодов UCS.

       * В кодировке UTF-8 никогда не используются байты с кодами 0xfe и 0xff.

       * Первый  байт  многобайтовой последовательности, представляющей один не-ASCII UCS-символ,
         всегда  находится  в  диапазоне  от  0xc0  до  0xfd  и  указывает,   какой   длины   эта
         последовательность. Все последующие байты в многобайтовой последовательности находятся в
         диапазоне  от  0x80  до  0xbf.   Это  обеспечивает  легкую  ресинхронизацию,   устраняет
         необходимость  учитывать  состояние  входного  потока (statelessness) и делает кодировку
         устойчивой к пропущенным байтам.

       * Символы UCS, закодированные в UTF-8, могут быть до шести байт в длину, тогда как символы
         Unicode  могут иметь длину лишь до трех байт.  Так как Linux использует только 16-битное
         подмножество UCS -- Unicode, то под Linux многобайтовые последовательности  UTF-8  могут
         быть одно-, двух- или трехбайтными. 

КОДИРОВКА

       Нижеследующие последовательности байт используются для представления символов.  Конкретная
       используемая последовательность зависит от номера символа в кодировке UCS:

       0x00000000 - 0x0000007F:
           0xxxxxxx

       0x00000080 - 0x000007FF:
           110xxxxx 10xxxxxx

       0x00000800 - 0x0000FFFF:
           1110xxxx 10xxxxxx 10xxxxxx

       0x00010000 - 0x001FFFFF:
           11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

       0x00200000 - 0x03FFFFFF:
           111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

       0x04000000 - 0x7FFFFFFF:
           1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

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

ПРИМЕРЫ

       Символ Unicode с кодом 0xa9 = 1010 1001 (знак copyright) кодируется в UTF-8 как

              11000010 10101001 = 0xc2 0xa9

       а символ с кодом 0x2260 = 0010 0010 0110 0000 (знак "не равно") кодируется так:

              11100010 10001001 10100000 = 0xe2 0x89 0xa0

БЕЗОПАСНОСТЬ

       Спецификация Unicode требует,  чтобы  при  записи  файлов  в  UTF-8  использовалась  самая
       короткая  из  возможных  форма  записи;  например, двухбайтная последовательность с первым
       байтом 0xc0  не  соответствует  стандарту.   Был  также  опубликован  "UTF-8  Corrigendum"
       (поправка  к  стандарту),  в  котором программам запрещается принимать входные данные с не
       самыми короткими формами записи.  Это сделано из соображений  безопасности:  если  входные
       данные  проверяются  на  предмет  возможных  нарушений  безопасности,  то  программа может
       проверять только ASCII-версию последовательностей типа "/. ./", ";" или  NUL,  и  при  этом
       упустить  из  виду,  что есть множество не соответствующих ASCII методов представить такие
       последовательности.  См. также IETF RFC 2279.

       Однако, некоторые системы (использующие NUL для завершения строк)  используют  C0  80  для
       внутреннего представления NUL (ASCII 00).

СТАНДАРТЫ

       ISO 10646, Unicode 1.1, XPG4, Plan 9.

АВТОР

       Markus Kuhn <[email protected]>

СМОТРИ ТАКЖЕ

       unicode(7)

ПЕРЕВОД

       Перевел с английского Алексей Миллер <[email protected]> 2000

Что такое Unicode? | Recipes

Это вольный перевод статьи Unconfusing Unicode: What is Unicode?. Мне понравилась, может кому будет интересна и полезна.

Юникод выглядит очень запутанным из-за чего возникает много вопросов и проблем. Многие считают, что это кодировка или набор символов(character set), что в некоторой степени правильно, но на самом деле является заблуждением. То, что Юникод изначально создавался как и кодировка и набор символов, только усиливает заблуждения. Это попытка все разъяснить не просто рассказав что такое Юникод, а предоставив модель понимания(mental model) Юникода.

Совершенно не верная, но Полезная Модель Понимания Юникода(здесь и далее ПМПЮ):

  1. Юникод являет собой способ обработки текстовых данных. Это не набор символов и не кодировка.
  2. Юникод — это текст, все остальное — бинарные данные. И даже ASCII-текст является бинарными данными.
  3. Юникод использует набор символов UCS. Но UCS — не Юникод.
  4. Юникод может быть закодирован в бинарный вид с помощью UTF. Но UTF — не Юникод.

Теперь, если вы знаете что-то о Юникод, вы скажете: «Нууу, да, но это на самом деле не так». Поэтому попытаемся выяснить почему эта модель понимания, будучи не верной, все таки полезна. Начнем с набора символов…

О наборе символов(character set)

Что бы обработать текст на компьютере, необходимо сопоставить графемы, которые вы пишете на бумаге, с номерами. Такое сопоставление определяется набором символов, или таблицей символов, которая определяет номер для символа. Вот это и называется «набором символов». Символ не обязательно соответствует какой-либо графеме. Например, существует контрольный символ «BEL», который заставляет ваш компьютер «пищать». Количество символов в наборе символов обычно 256, именно столько влазит в один байт. Есть наборы символов, которые занимают всего 6 бит. Долгое время в вычислениях доминировали 7-ми битные ASCII наборы символов, но 8-ми битные наиболее распространены.

Но 256 явно не то число, которое может вместить все необходимые в нашем мире символы. Вот поэтому и появился Юникод. Когда я сказал, что Юникод не набор символов, я соврал. Изначально Юникод был 16-ти битным набором символов. Но не смотря на то, что создатели Юникод считали, что 16 бит вполне достаточно(и они были правы), некоторые считали что 16 бит совсем не достаточно(и они тоже были правы). В конце концов они создали конкурирующую кодировку и назвали ее Универсальный набор символов(Universal Character Set, UCS). Через некоторое время команды решили объедение усилия и эти два набора символов стали одинаковыми. Вот поэтому мы можем считать, что Юникод использует UCS в качестве набора символов. Но это так же и ложь — на самом деле у каждого стандарта свой набор символов, просто так вышло, что они одинаковые(хотя UCS немного отстает).

Но для нашей ПМПЮ — «Юникод — это не набор символов».

О UCS

UCS — это 31-битный набор символов, который содержит более 100 000 символов. 31 бит — что бы не решать проблему «знаковые числа против без знаковых». Так как сейчас используется меньше чем 0.005% из всего возможного количества символов, этот лишний бит совсем не нужен.

Хотя 16 бит было не достаточно, что бы вместить все символы когда-либо созданные человечеством, этого вполне достаточно если вы готовы ограничить себя только ныне существующими языками. Поэтому основная часть символов UCS влезла в первые 65536 номеров. Их назвали «Basic Multilingual Plane» или BMP. Они по сути и есть 16-ти битный набор символов Юникода, хотя каждая версия UCS расширяет его все новыми и новыми символами. BMP становится актуальным, когда речь идет о кодировках, но про это немного ниже.

Каждый символ в UCS имеет название и номер. Символ «H» имеет название «LATIN CAPITAL LETTER H»(ЗАГЛАВНАЯ ЛАТИНСКАЯ БУКВА H) и номер 72. Номер обычно представлен в шестнадцатеричном виде, и часто с префиксом ‘U+’ и 4, 5 или 6 цифрами, что бы указать, что подразумевается символ Юникод. Поэтому номер символа «H» чаще представлен как U+0048, чем — 72, хотя это одно и тоже. Еще один пример, это символ «—», который называется «EM DASH», или U+2012. Символ «乨» называется «CJK UNIFIED IDEOGRAPH-4E68», чаще представлен как U+4E68. Символ «

Так как названия и номера символов в Unicode и UCS совпадают, для нашей ПМПЮ мы будем считать что UCS — не Unicode, но Unicode использует UCS. Это вранье, но полезное вранье, которое позволяет различать Юникод и набор символов.

Про кодировки

Таким образом, набор символов это совокупность символов, каждый из которых имеет свой номер. Но как вы должны хранить их, или отслать на другой компьютер? Для 8-битных символов это просто, вы используете один байт на символ. Но UCS использует 31 бит и вам необходимо 4 байта на символ, что создает проблему с порядком байтов и неэффективностью использования памяти. Так же, не все сторонние приложения могут работать со всеми символами Unicode, но нам все равно необходимо взаимодействовать с этими приложениями.

Выход — использовать кодировки, которые указывают как преобразовать Юникод текст в 8-битные бинарные данные. Примечательно то, что ASCII является кодировкой, и ASCII данные с точки зрения ПМПЮ являются бинарными!

В большинстве случаев кодировка является так же набром символов и называется так же как и набор символов, который кодирует. Это верно для Latin-1, ISO-8859-15, cp1252, ASCII и др. В то время, как большинство наборов символов являются и кодировками, для UCS это не так. Также запутывает, что UCS это то, во что вы декодируете и из чего кодируете, в то время как остальные наборы символов являются тем, из чего вы декодируете и во что кодируете(так как название кодировки и набора символов совпадает). Таким образом вы должны воспронимать набор символов и кодировки как разные вещи, не смотря на то, что часто эти термины взаимозаменяемы по смыслу.

Про UTF

Большинство кодировок работают с набором символов, которые являются лишь малой частью UCS. Это становится проблемой для многоязычных данных, вот по этому необходима кодировка, которая использует все символы UCS. Кодировка 8-битных символов очень простая, так как вы получаете один символ из одного байта, но UCS использует 31 бит и вам необходимо 4 байта на символ. Появляется проблема порядка байтов так как некоторые системы используют порядок от старшего к младшему, другие — наоборот. Так же часть байтов всегда будут пустыми, это пустая трата памяти. Правильная кодировка должная использовать различное количество байтов для различных символов, но такая кодировка будет эффективная в одних случаях и не эффективна в других.

Решение этой головоломки — использовать несколько кодировок из которых вы можете выбрать подходящую. Они называются Unicode Transformation Formats, или UTF.

UTF-8 — самая распространенная кодировка в Интернете. Она использует для ASCII символов один байт, а для всех остальных символов UCS 2 или 4 байта. Это очень эффективно для языков использующих латинские буквы, так как они все входят в ASCII, достаточно эффективно для Греческого, Кириллицы, Японского, Армянского, Сирийского, Арабского и др., так как для них используется 2 байта на символ. Но это не эффективно для всех остальных языков из BMP, так как будет использоваться 3 байта на символ, а для всех остальных символов UCS, например Готическое письмо, будет использоваться 4 байта.

UTF-16 использует для всех символов из BMP одно 16-битное слово и два 16-битных слова для всех остальных символов. По этому, если вы не работает содним из упомянутых выше языков, вам лучше использовать UTF-16. Так как UTF-16 использует 16-битные слова, мы получаем проблему порядка байтов. Она решена наличием трех вариантов: UTF-16BE для порядка байтов от старшего к младшему, UTF-16LE — от младшего к старшему, и просто UTF-16, который может быть UTF-16BE или UTF-16LE, при кодировании в начале используется маркер, который указывает порядок байтов. Этот маркер называется «byte order mark», или «BOM».

Так же существует UTF-32, который может быть в двух вариантах BE и LE как и UTF-16, и хранит символ Юникод как 32-битное целое число. Это не эффективно почти для всех символов, кроме тех, которые требуют 4 байта для хранения. Но при этом очень легко обрабатывать такие данные, так как у вас всегда 4 байта на символ.

Важно разделять кодированные данные от данных Юникод. По этому не думайте о UTF-8/16/32 данных как о Юникод. Таким образом хотя кодировки UTF и определены в стандарте Unicode, в рамках ПМПЮ мы считаем что UTF — это не Юникод.

О Юникод

UCS содержит объединяющие символы, например трема, которая добавляет две точки над символом. Это ведет к неопределенности при выражении одной графемы(буква или знак) через несколько символов. Возьмем для примера ‘ö’, который может быть представлен как символ LATIN SMALL LETTER O WITH DIAERESIS, но в тоже время как сочетание символов LATIN SMALL LETTER O и следующим за ним COMBINING DIAERESIS.

Но в реальной жизни вы не можете дополнить любой символ тремой. Например, нет смысла добавлять две точки над символом Евро. Юникод содержим правила для таких вещей. Он указывает что вы можете выразить ‘ö’ двумя способами и это будет один и тот же символ, но если вы используете трему для знака Евро, вы совершаете ошибку. Таки образом правила комбинирования символов являются частью стандарта Юникод.

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

Используя ПМПЮ мы определили, что Юникод это UCS плюс правила обработки текста. Или другими словами: Юникод это способ работы с текстовыми данными и не важной какой язык или письмо они используют. В Юникод ‘H’ это не просто символ, он имеет какое-то смысл. Набор символов указывает что ‘H’ символ с номером 72, в то время как Юникод говорит вам, что при сортировке ‘H’ следует перед ‘I’ и вы можете использовать две точки над ним получив ‘Ḧ’.

Таким образом Юникод — это не кодировка и не набор символов, это способ работы с текстовыми данными.

Объяснение кодировки символов Unicode

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

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

Кодировка символов

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

Например, я мог бы сказать, что буква A становится числом 13, a = 14, 1 = 33, # = 123 и т. Д.

Именно здесь вступают в силу общеотраслевые стандарты. Если вся компьютерная индустрия использует одну и ту же схему кодирования символов, каждый компьютер может отображать одни и те же символы.

Что такое Юникод?

ASCII (Американский стандартный код для обмена информацией) стал первой широко распространенной схемой кодирования. Однако он ограничен определениями только 128 символов. Это нормально для наиболее распространенных английских символов, цифр и знаков препинания, но немного ограничивает остальной мир.

Естественно, остальной мир хочет такой же схемы кодирования и для своих персонажей. Однако какое-то время, в зависимости от того, где вы находились, для одного и того же кода ASCII мог отображаться другой символ.

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

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

В наши дни стандарт Unicode определяет значения для более чем 128 000 символов, и его можно увидеть в Консорциуме Unicode. Имеет несколько форм кодировки символов:

  • UTF-8: Использует только один байт (8 бит) для кодирования английских символов. Он может использовать последовательность байтов для кодирования других символов. UTF-8 широко используется в системах электронной почты и в Интернете.
  • UTF-16: Использует два байта (16 бит) для кодирования наиболее часто используемых символов.При необходимости дополнительные символы могут быть представлены парой 16-битных чисел.
  • UTF-32: Использует четыре байта (32 бита) для кодирования символов. Стало очевидно, что по мере роста стандарта Unicode 16-битное число слишком мало для представления всех символов. UTF-32 может представлять каждый символ Юникода как одно число.

Примечание. UTF означает блок преобразования Unicode.

Кодовые точки

Кодовая точка — это значение, присвоенное символу в стандарте Unicode.Значения в соответствии с Unicode записываются как шестнадцатеричные числа и имеют префикс U + .

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

  • A — это U + 0041
  • a — это U + 0061
  • 1 — это U + 0031
  • # — это U + 0023

Эти кодовые точки разделены на 17 различных секций, называемых плоскостями, обозначенными цифрами от 0 до 16. Каждая плоскость содержит 65 536 кодовых точек.Первая плоскость, 0, содержит наиболее часто используемые символы и известна как базовая многоязычная плоскость (BMP).

Кодовые единицы

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

Рассмотрим в качестве примера UTF-16. Каждое 16-битное число представляет собой кодовую единицу. Кодовые единицы могут быть преобразованы в кодовые точки. Например, символ плоской банкноты ♭ имеет кодовую точку U + 1D160 и находится на второй плоскости стандарта Unicode (дополнительная идеографическая плоскость).Он будет закодирован с использованием комбинации 16-битных кодовых единиц U + D834 и U + DD60.

Для BMP значения кодовых точек и кодовых единиц идентичны. Это позволяет использовать ярлык для UTF-16, который экономит много места для хранения. Для представления этих символов необходимо использовать только одно 16-битное число.

Как в Java используется Unicode?

Java была создана примерно в то время, когда в стандарте Unicode были определены значения для гораздо меньшего набора символов. Тогда считалось, что 16 бит будет более чем достаточно для кодирования всех символов, которые когда-либо понадобятся.Имея это в виду, Java была разработана для использования UTF-16. Тип данных char изначально использовался для представления 16-битной кодовой точки Unicode.

Начиная с Java SE v5.0, символ представляет собой кодовую единицу. Это не имеет большого значения для представления символов, которые находятся в базовой многоязычной плоскости, потому что значение кодовой единицы такое же, как и кодовая точка. Однако это означает, что для персонажей на других планах необходимы два символа.

Важно помнить, что один тип данных char больше не может представлять все символы Unicode.

UTR # 17: Модель кодирования символов

Технический отчет Unicode № 17

Сводка

В этом документе разъясняется ряд терминов, используемых для описания
кодировки символов, и где подходят различные формы Unicode. Это
разрабатывает трехуровневую структуру Совета по архитектуре Интернета (IAB).
«Текстовый поток» в четырехуровневую структуру.

Статус

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

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

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

Содержание

  1. Модель кодировки символов
  2. Репертуар абстрактных персонажей
  3. Набор кодированных символов

  4. (CCS)
  5. Форма кодировки символов (CEF)
  6. Схема кодирования символов

  7. (CES)
  8. Карты персонажей
  9. Синтаксис кодирования передачи
  10. Типы данных и привязка API
  11. Определения и сокращения

В этом отчете описывается модель конструкции
кодировок символов.Модель кодировки символов Unicode помещает Unicode
Стандарт в контексте других кодировок символов всех типов, а также
существующие модели, такие как архитектура персонажей, продвигаемая Интернетом
Совет по архитектуре (IAB) для использования на
Интернет, или определенная Архитектура представления символьных данных [CDRA]
от IBM для организации и каталогизации собственного массива символов, зависящего от поставщика.
кодировки. В этом документе основное внимание уделяется тому, как эти модели должны быть расширены и
разъяснено, чтобы охватить все аспекты стандарта Unicode и ISO / IEC 10646
[10646].(Список общих сокращений, используемых в этом тексте, см.
Раздел 9
Определения и сокращения ).

Четыре уровня модели кодирования символов Юникода
можно резюмировать как:

  • ACR: Репертуар абстрактных персонажей
    • набор символов для кодирования, например, некоторый алфавит или
      набор символов
  • CCS: Набор кодированных символов
    • отображение репертуара абстрактного персонажа на набор
      неотрицательные целые числа
  • CEF: Форма кодирования символов
    • отображение набора неотрицательных целых чисел, которые являются элементами CCS
      к
      набор последовательностей определенных кодовых единиц определенной ширины,
      такие как 32-битные целые числа
  • CES: Схема кодирования символов
    • обратимое преобразование из набора последовательностей кодовых единиц (из одного или
      больше CEF для сериализованной последовательности байтов

Помимо четырех отдельных уровней, есть еще два
полезные понятия:

  • CM: Таблица символов
    • отображение последовательностей
      члены репертуара абстрактных символов для сериализованных последовательностей байтов
      соединение всех четырех уровней за одну операцию.
  • TES: Синтаксис кодирования передачи
    • обратимое преобразование закодированных данных. Эти данные могут или не могут
      содержат текстовые данные

Модель IAB, как определено в [RFC 2130],
различает три уровня: Набор кодированных символов (CCS), Символ
Схема кодирования
(CES) и синтаксис кодирования передачи (TES).
Однако четыре
уровни должны быть
определены, чтобы адекватно охватить различия, необходимые для Unicode
модель кодировки символов.Один из них,
Репертуар абстрактных персонажей , неявно присутствует в
модель IAB. Модель Unicode также
дает TES отдельный
статус вне модели, добавляя дополнительный уровень между CCS и CES.

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

Репертуар из 2 абстрактных персонажей

Репертуар персонажей определяется как
неупорядоченный
набор абстрактных символов для кодирования. Слово abstract означает, что эти объекты определены условно. Во многих случаях
Репертуар состоит из знакомого алфавита или набора символов.

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

В некоторых других наборах символов используется ограниченное
понятие открытого репертуара. Например, у Microsoft есть
время от времени расширял репертуар наборов символов Windows
добавив несколько символов к существующему
репертуар. Это произошло, когда ЗНАК ЕВРО был добавлен к
репертуар для ряда наборов символов Windows, например. Для предложений о том, как сопоставить неназначенные символы открытых репертуаров, см. [CharMapML].

Репертуар — это объекты, которые получают CS
(«Набор символов») значения в IBM CDRA
архитектура.

Примеры репертуара персонажей:

  • японские слоговые и идеограммы
    JIS X 0208 (CS 01058)
    [фиксированный]
  • западноевропейские алфавиты и символы Latin-1 (CS 00697)
    [фиксированный]
  • репертуар переносимых персонажей POSIX [исправлено]
  • Японский репертуар хоста IBM (CS 01001) [исправлено]
  • Windows, западноевропейский репертуар [open]
  • репертуар Unicode / 10646 [открыть]

2.

1 Управление версиями

Стандарт Unicode изменяет свой репертуар путем публикации основных и
второстепенные редакции стандарта: 1.0, 1.1, 2.0, 2.1, 3.0, … Репертуар для
каждая версия определяется перечислением абстрактных символов, включенных в
та версия.

Расширения репертуара для стандарта Unicode теперь строго аддитивны,
несмотря на то, что в самых ранних версиях (1.0
и 1.1) и влияющие на
обратная совместимость с ними.Основной причиной этого было слияние
[Unicode] с [10646].
Начиная с версии 2.0 и до бесконечности в будущих версиях,
после включения ни один персонаж никогда не удаляется из репертуара,
как указано в Политике стабильности Unicode [Стабильность].

Версия репертуара отличается от
управление версиями стандарта Unicode в целом, в частности символа Unicode
База данных [UCD], которая определяет свойства персонажа (см. Также
[PropModel]).Есть версии обновления текста Unicode
стандарт и базы данных символов Unicode между основной и дополнительной версиями
стандарт Юникода. Хотя эти версии обновления могут изменять свойства персонажей и
описания поведения персонажа, они не добавляют в репертуар персонажа.
Для получения дополнительной информации о версиях стандарта Unicode см.
Версии стандарта Unicode
[Версии].

ISO / IEC 10646 имеет другой механизм расширения своего репертуара.В
Репертуар 10646 расширен путем формального внесения поправок. Как каждый человек
опубликована поправка, содержащая дополнительные символы,
расширяет репертуар 10646.
Репертуар стандарта Unicode и ISO / IEC 10646:
согласовано, координируя публикацию основных версий
стандарта Unicode с публикацией четко определенного списка поправок
для 10646 или с серьезным пересмотром и переизданием 10646.

2.2 Персонажи vs.Глифы

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

Символы не соответствуют друг другу символам. Например,
последовательность «f» , за которой следует «i» может быть представлена ​​одним
глиф, называемый лигатурой fi. Обратите внимание, что фигуры объединены
вместе, и точка отсутствует в «i» в следующем
пример:

Рисунок 2
Последовательность символов Образец символа

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

Рисунок 3
Последовательность символов Возможная последовательность символов


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

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

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

Рисунок 6
Персонаж Последовательность знаков

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

Рисунок 7
Персонаж Разделить символы

В общем случае
соответствие между глифами и символами нет
один к одному и не может быть предсказан только по тексту. Будь
конкретная строка символов отображается определенной последовательностью глифов
будет зависеть от сложности операционной системы хоста и шрифта. В
порядок глифов также не обязательно соответствует порядку
символы. В частности, буквы с написанием справа налево, такие как арабский и иврит.
приводят к сложному переупорядочиванию. См. UAX # 9: .
Двунаправленный алгоритм

[Биди].

2.3 Совместимые символы

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

То, что конечный пользователь считает одним символом (также называемым графемой
в контексте Unicode)
фактически может быть представлен несколькими кодовыми точками; и наоборот, единый код
точка может соответствовать нескольким символам.Вот несколько примеров:

Для получения дополнительной информации о графемах см. UAX # 29:
Границы текста [Границы].

2.4 Подмножества

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

Механизмы формального подмножества иногда встречаются в реализациях некоторых
Наборы азиатских символов, где, например, различие между «Уровень 1
JIS »и« Уровень 2 JIS »относится к определенным частям
репертуар символов кандзи JIS X 0208, который будет включен в
выполнение.

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

Европейский комитет по стандартизации (CEN)
определил несколько многоязычных европейских подмножеств ISO / IEC 10646-1 (называемых MES-1,
MES-2, MES-3A и MES-3B). MES-1 и MES-2 были добавлены как именованные фиксированные коллекции.
в 10646.

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

Набор кодированных символов определяется как отображение из набора
абстрактные символы к множеству неотрицательных целых чисел. Этот диапазон
целые числа не обязательно должны быть смежными. В стандарте Unicode концепция
скалярного значения Unicode (см.определение D28 в главе 3 «Соответствие»
[Unicode])
явно определяет такой несмежный диапазон целых чисел.

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

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

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

В архитектуре IBM CDRA
Значения CP («кодовой страницы») относятся к закодированным
наборы символов. Обратите внимание, что такое использование термина кодовая страница вполне допустимо.
точный и ограниченный.Этого не должно быть — но обычно —
путают с общим использованием кодовой страницы для обозначения символа
схемы кодирования.

Примеры наборов кодированных символов:

Имя Репертуар
JIS X 0208 присваивает пары целых чисел, известные как kuten очков
ISO / IEC 8859-1 ASCII плюс Latin-1
ISO / IEC 8859-2 другой репертуар, чем 8859-1, хотя оба используют один и тот же
кодовое пространство
Кодовая страница 037 тот же репертуар, что и 8859-1; разные целые числа, присвоенные
одинаковый
персонажи
Кодовая страница 500 тот же репертуар, что и 8859-1, и кодовая страница 037; разные целые числа
Стандарт Unicode, версия 2. 0 точно такой же репертуар и отображение
ISO / IEC 10646-1: 1993
плюс поправки 1-7
Стандарт Unicode, версия 3.0 точно такой же репертуар и отображение
ISO / IEC 10646-1: 2000
Стандарт Unicode, версия 4.0 точно такой же репертуар и отображение
ISO / IEC 10646: 2003

Этот документ не пытается перечислить все версии
стандарт Юникода.Посмотреть версии
стандарт Unicode [версии] для полного списка
версий и информацию о том, как они соответствуют конкретным версиям и
поправки к 10646.

3.1 Именование символов

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

Основным обоснованием практики именования персонажей в SC2 было предоставление
механизм для однозначной идентификации абстрактных персонажей в разных
репертуары с разными отображениями на целые числа в разном кодированном символе
наборы. Таким образом, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА А С ТЯЖЕЛЫМ
то же
абстрактный характер, хотя и происходил в разных репертуарах и
присвоены разные целые числа в разном кодированном наборе символов.

IBM CDRA [CDRA], с другой стороны, обеспечивает
идентичность символов в различных наборах кодированных символов (или кодовых страниц ) путем присвоения каталожного номера
известный как GCGID (графический символ
глифический идентификатор) для каждого абстрактного символа, используемого в любом из
репертуар составлен CDRA. Абстрактные символы, имеющие одинаковые
GCGID в двух разных наборах кодированных символов по определению одинаковы
персонаж. Другие поставщики использовали аналогичные системы внутренней идентификации.
для абстрактных персонажей.

Появление Unicode / 10646 в значительной степени сделало такие схемы устаревшими. В
идентичность абстрактных символов во всех других наборах кодированных символов
все чаще определяется ссылкой на сам Unicode / 10646. Часть
давление, чтобы включить каждый «символ» из всех существующих закодированных
набор символов в стандарте Unicode является результатом стремления многих получить
избавиться от вспомогательных механизмов для отслеживания мелочей, лишних деталей, которые
не являются частью Unicode, а вместо этого просто используйте Unicode
Стандарт как универсальный каталог персонажей.

3.2 Кодовые пространства

Диапазон неотрицательных целых чисел, используемых для отображения абстрактных
Символы определяют связанную концепцию кодового пространства . Традиционный
границы для типов пространств кода тесно связаны с формами кодирования
(см. ниже), поскольку отображение абстрактных символов в неотрицательные целые числа
выполняются с учетом конкретных форм кодирования. Примеры
значимых кодовых пространств: 0..7F, 0..FF, 0..FFFF, 0..10FFFF, 0..7FFFFFFF,
0..FFFFFFFF.

Кодовые пространства также могут иметь довольно сложную структуру, в зависимости от
считается ли диапазон целых чисел непрерывным или
определенные диапазоны значений запрещены. Результат большинства осложнений
из соображений формы кодирования. Когда в форме кодирования указано, что
целые числа, которые кодируются, должны быть сериализованы как последовательности байтов, есть
часто накладываются ограничения на конкретные значения, которые могут иметь эти байты.
Чаще всего такие ограничения запрещают байтовые значения, соответствующие функциям управления.С точки зрения кода
пространство, такие ограничения на байтовые значения приводят к нескольким несмежным диапазонам целых чисел, которые запрещены для
отображение репертуара персонажей. (См. [Lunde] для
двумерные диаграммы типичных кодовых пространств для азиатских кодированных символов
наборы, реализующие такие ограничения.)

Примечание: В ISO
По стандартам термин октет используется для 8-битного байта. В этом документе
термин байт используется последовательно только для 8-битного байта.

Форма кодировки символов — это отображение набора используемых целых чисел.
в CCS к набору последовательностей кодовых единиц.А
кодовая единица — это
целое число, занимающее заданную двоичную ширину в компьютерной архитектуре, например
8-битный байт. Форма кодирования позволяет представлять символы как актуальные.
данные в компьютере. Последовательности кодовых единиц не обязательно имеют
такая же длина.

  • Форма кодировки символов, все последовательности которой имеют одинаковую длину:
    известная как с фиксированной шириной .
  • Форма кодировки символов, последовательности которой не имеют одинаковой длины
    известна как переменной ширины .

Форма кодировки символов для набора кодированных символов определяется как
форма кодировки символов, которая отображает все закодированные символы для этого
кодированный набор символов.

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

При интерпретации последовательности кодовых единиц есть три возможности:

  1. Последовательность недопустима. Есть два варианта этого:
    В первом варианте последовательность
    неполный . Например,

    • 0xA3 не завершен в CP950.
      • Если за ним не следует другой байт правильной формы, это
        незаконно.
    • 0xD800 является неполным в Юникоде.
      • Если за ним не следует другое 16-битное значение правильной формы, оно
        незаконно.

    Во втором варианте последовательность полная, но явно
    незаконно. Например,

    • 0xFFFF недопустимо в Юникоде. Это значение никогда не может встречаться в допустимом
      Текст в Юникоде и никогда не будет назначен.
  2. Последовательность представляет собой действительный код, но — неназначенный .
    Эта последовательность может получить задание в будущем, эволюционировала
    версия кодировки символов. Для предложений о том, как
    обрабатывать неназначенные символы при отображении, см. [CharMapML].
    Например,

    • 0xA3 0xBF не назначен в CP950 по состоянию на 1999 год.
    • 0x0EDE не назначен в Unicode, V3.0
  3. Исходной последовательности присвоено : она представляет действительный закодированный
    персонаж. Есть два варианта этого:
    Первый — это стандартный присвоенный символ. Например,

    • 0x0EDD назначается в Unicode, V3.0

    Второй вариант — это пользовательский символ. Например,

    • 0xE000 — это назначенный пользователем символ, семантический
      интерпретация оставлена ​​на усмотрение сторон за пределами
      контекст стандарта.

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

Формы кодирования бывают разных типов. Некоторые из них являются эксклюзивными для
Unicode / 10646, тогда как другие представляют общие шаблоны, которые повторяются
снова и снова для сотен кодированных наборов символов.Некоторые из наиболее важных
примеры форм кодирования следуют.

Примеры форм кодирования фиксированной ширины:

Пример

Пример

Тип Каждый символ
закодирован как
Банкноты
7-битный одно 7-битное количество пример: ISO 646
8-битный G0 / G1 одно 8-битное количество с ограничениями на использование пространств C0 и C1
8-битный одно 8-битное количество без ограничений по использованию пространства C1
8-битный EBCDIC одно 8-битное количество с соглашениями EBCDIC, а не
Условные обозначения ASCII
16-бит (UCS-2) одно 16-битное количество в кодовом пространстве 0..FFFF
32-бит (UCS-4) одно 32-битное количество в кодовом пространстве 0..7FFFFFFF
32-разрядная (UTF-32) одно 32-битное количество в кодовом пространстве 0. .10FFFF
16-битный код процесса DBCS одно 16-битное количество: UNIX widechar реализации азиатского CCS
32-битный код процесса DBCS одно 32-битное количество: UNIX widechar реализации азиатского CCS
Хост DBCS две 8-битные величины в соответствии с соглашениями о хостах IBM

Примеры форм кодирования переменной ширины:

Имя Символы кодируются как Банкноты
UTF-8 сочетание от одной до четырех 8-битных кодовых единиц
в Unicode
и от одной до шести кодовых единиц в 10646
используется только с Unicode / 10646
UTF-16 сочетание от одной до двух 16-битных кодовых единиц используется только с Unicode / 10646

Форма кодирования определяет один из фундаментальных аспектов
кодировки: сколько кодовых единиц существует для каждого символа. В
количество кодовых единиц на символ важно для интернационализированного программного обеспечения. Раньше
это было эквивалентно тому, сколько байтов каждый символ
был представлен. С введением Unicode и 10646 более широкого кода
агрегаты для UCS-2,
UTF-16,
UCS-4 и UTF-32, это обобщено на две части
информации: спецификация ширины кодовой единицы, и
количество кодовых единиц, используемых для представления каждого символа.
Форма кодирования UCS-2, связанная с
ISO / IEC 10646 и может выражать только символы в
БМП,
это форма кодирования с фиксированной шириной.Напротив, UTF-16 использует один или два кода.
единиц и может покрывать все кодовое пространство Unicode.

UTF-8 является хорошим примером. В UTF-8 основная кодовая единица, используемая для представления символьных данных, составляет 8 бит.
широкий (то есть байт или октет). Карта ширины для UTF-8:

0x00..0x7F 1 байт
0x80. .0x7FF 2 байта
0x800..0xD7FF, 0xE000..0xFFFF 3 байта
0x10000 .. 0x10FFFF 4 байта

Примеры форм кодирования применительно к конкретным наборам кодированных символов:

Имя Формы кодирования
JIS X 0208 обычно преобразуется из нотации kuten в 16-битную форму кодирования «код JIS»,
для
пример «nichi», 38 92 (kuten) → 0x467C Код JIS
ISO 8859-1 имеет 8-битную форму кодирования G0 / G1
CP 037 8-битная форма кодирования EBCDIC
CP 500 8-битная форма кодирования EBCDIC
US ASCII 7-битная кодировка формы
ISO 646 7-битная кодировка формы
Окна CP 1252 8-битная кодировка формы
Юникод 4. 0 Форма кодировки UTF-16 (по умолчанию), UTF-8 или UTF-32
Юникод 3.0 либо форма кодировки UTF-16 (по умолчанию), либо UTF-8
Юникод 1.1 форма кодировки UCS-2 (по умолчанию) или UTF-8
ISO / IEC 10646, в зависимости от заявленных уровней реализации может иметь UCS-2,
UCS-4, UTF-16 или UTF-8.
  • Обратите внимание, что Shift-JIS не является формой кодирования.Это обсуждается в
    следующий раздел.

Схема кодировки символов (CES) — это
обратимое преобразование последовательностей кодовых единиц в последовательности байтов в одном из
три пути:

а. простой CES использует отображение каждого
кодовая единица CEF в уникальный сериализованный
последовательность байтов по порядку.

г. Соединение CES использует два или более простых CES, а также механизм переключения
между ними. Этот механизм включает байты (например, одиночные смены, SI / SO или
escape-последовательности), которые не являются частью каких-либо простых CES, но которые
определяется архитектурой кодировки символов и может потребовать внешнего
реестр конкретных значений (например, для управляющих последовательностей ISO 2022).

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

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

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

  • Большинство форм байтового кодирования фиксированной ширины имеют тривиальное отображение
    в CES: каждое 7-битное или 8-битное количество отображается в байт того же значения.
  • Большинство форм байтового кодирования смешанной ширины также просто сериализуют
    последовательность CC-элементов данных в байты.

    • UTF-8 следует этому шаблону, потому что он уже ориентирован на байты
      форма кодирования.
    • UTF-16 должен указывать порядок байтов для сериализации байтов, поскольку он включает в себя 16-битные величины.
      Порядок байтов — единственное различие между UTF-16BE,
      в котором два байта 16-битного количества сериализованы в
      обратный порядок байтов и UTF-16LE, в котором они сериализованы в
      порядок обратного порядка байтов.

Важно не путать форму кодировки символов (CEF) и CES.

  1. CEF сопоставляет кодовые точки с кодовыми единицами, в то время как CES
    преобразует последовательности кодовых единиц в
    байтовые последовательности. (Для прямого отображения символов в сериализованные байты см.
    Раздел 6 Карты символов .)
  2. CES должен учитывать байтовый порядок сериализации всего кода.
    единицы шире байта, которые используются в CEF.
  3. В остальном идентичные CES могут отличаться другими аспектами, такими как количество определяемых пользователем
    допустимые символы. (Это, в частности, относится к IBM
    CDRA
    архитектура, которая может отличать хост
    CCSID в зависимости от того, установлен ли
    УДК можно конвертировать в соответствующую кодовую страницу или
    нет.)

Обратите внимание, что некоторые схемы кодирования Unicode имеют те же метки, что и
три Unicode
кодирование форм. При неквалифицированном использовании термины UTF-8, UTF-16 и
UTF-32 являются
двусмысленный
между их смыслом как формы кодирования Unicode и как схемы кодирования Unicode.Для UTF-8,
эта двусмысленность обычно безобидна, потому что схема кодирования UTF-8
тривиально
полученный из последовательностей байтов, определенных для формы кодирования UTF-8.
Однако для UTF-16 и UTF-32 неоднозначность более проблематична. Как формы кодирования,
UTF-16 и
UTF-32 относится к кодовым единицам, поскольку они
доступны из памяти через
16-битные или 32-битные типы данных; нет связанного байта
ориентация и спецификация
никогда не используется. (Просмотр памяти в
отладчик или преобразование более широких типов данных в байтовые массивы — это байтовая сериализация).

В качестве кодировки схемы , UTF-16 и UTF-32 относятся к сериализованным
байтов, например сериализованные байты для
потоковая передача данных или в файлах; они могут иметь как байтовую ориентацию, так и
одна спецификация может быть
присутствует в начале данных. Когда использование
сокращенные обозначения UTF-16 или UTF-32 могут быть
неправильно истолковано, и
где различие между их использованием в отношении форм кодирования Unicode
или для схем кодирования Unicode важно, следует использовать полные термины.Например, используйте
Форма кодировки UTF-16 или UTF-16
схема кодирования
. Они также могут быть сокращены до UTF-16 CEF или UTF-16 CES,
соответственно.

Примеры схем кодирования символов Unicode:

  • Стандарт Unicode имеет семь схем кодирования символов:
    UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE и UTF-32LE.

    • UTF-8, UTF-16BE, UTF-16LE, UTF-32BE и UTF32-LE — простые CES
    • UTF-16 и UTF-32 — составные CES, состоящие из
      одиночный, необязательный знак порядка байтов
      в начале данных следует простой CES.

      Имя CEF CES
      UTF-8 + простой
      UTF-16 + соединение
      UTF-16BE простой
      UTF-16LE простой
      UTF-32 + соединение
      UTF-32BE простой
      UTF-32LE простой

  • Юникод 1. 1 имел три схемы кодировки символов: UTF-8, UCS-2BE и
    UCS-2LE, хотя в то время два последних так не назывались.

Примеры символов, отличных от Unicode
Схемы кодирования:

  • кодировки на основе ISO 2022 (ISO-2022-JP, ISO-2022-KR и т. Д.), Которые используют
    встроенные escape-последовательности; эти
    являются составными CES.
  • DBCS
    Shift (смесь одного однобайтового CCS, например
    JIS X 0201 и DBCS CCS,
    например на основе JIS X0208, с числовым сдвигом целочисленных значений),
    за
    Например, кодовая страница 932 в Windows.
  • EUC (аналогично кодировкам DBCS Shift, с применением
    различные правила числового сдвига и введение односменных байтов:
    0x8E и 0x8F, которые могут вводить 3-байтовые и 4-байтовые последовательности), для
    например, EUC-JP или EUC-TW в UNIX.
  • Хост IBM смешанной кодовой страницы азиатских наборов символов, которые формально смешивают два
    различные CCS с соглашениями о переключении SI / SO, например,
    CCSID
    5035 на японских хост-машинах IBM.

Примеры сжатия символов
Схемы кодирования:

  • BOCU-1, см.
    Техническое примечание Unicode № 6:
    BOCU-1: MIME-совместимое сжатие Unicode .[BOCU].
    BOCU-1 отображает каждую входную строку в уникальную сжатую строку, но не отображает каждую кодовую единицу в уникальную серию байтов.
  • Punycode, определенный в [RFC3492],
    как и BOCU-1, уникален только на строковой основе.
  • SCSU (и
    RCSU): см.
    UTR # 6: Стандартная схема сжатия для Unicode
    [SCSU]. Входными данными для SCSU и RCSU являются кодовые единицы, на выходе — сжатый поток байтов.
    Из-за эвристики сжатия одна и та же входная строка может приводить к разным байтовым последовательностям, но схемы полностью
    обратимый.

Порядок 5,1 байта

Архитектура процессоров

отличается тем, что многобайтовые
машинные целые числа отображаются в места хранения. Little Endian архитектуры положить
младший байт в младшем адресе, а Big Endian архитектуры
начать со старшего байта.

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

По внешнему обозначению потоков данных три
можно выделить типы байтовых порядков: Big Endian (BE) ,
с прямым порядком байтов (LE)
и по умолчанию или с внутренней маркировкой .

В Юникоде символ в кодовой точке U + FEFF определяется как
метка порядка байтов , в то время как его обратный байтовый аналог, U + FFFE является
несимвольный (U + FFFE) в UTF-16 или за пределами кодового пространства (0xFFFE0000) для UTF-32. Во главе потока данных
поэтому наличие метки порядка байтов может использоваться для однозначной сигнализации байта
порядок кодовых единиц.

Отображение из последовательности
члены репертуара абстрактного персонажа сериализованной последовательности
байтов называется картой символов (CM).Простая карта символов
таким образом, неявно включает CCS,
CEF и CES, отображение из аннотации
символы для кодирования единиц в байты. Составная карта символов включает
соединение CES и, таким образом, включает более одного CCS и CEF. В этом случае
репертуар абстрактных персонажей для карты персонажей — это объединение
репертуар, охватываемый задействованными кодированными наборами символов.

Технический отчет

Unicode № 22:
Язык разметки отображения символов
[CharMapML] определяет спецификацию XML для
представляющие детали карт персонажей.В тексте также подробно обсуждаются вопросы картографии.
между наборами символов.

Карты персонажей — это сущности, которые получают
Кодировка IANA
[кодировка]
идентификаторы в архитектуре IAB. От
Точка зрения кодировки IANA
это важно что
последовательность закодированных символов однозначно отображается на последовательность
байтов по кодировке. Кодировка должна быть указана во всех случаях, как в
Интернет-протоколы, в которых текстовое содержимое рассматривается как упорядоченная последовательность
байтов, и где текстовое содержимое должно быть реконструировано из этого
последовательность байтов.

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

Во многих случаях одно и то же имя используется как для карты символов, так и для
схема кодировки символов, например UTF-16BE. Обычно это делается для простых
отображение символов, когда такое использование ясно из контекста.

Синтаксис кодирования передачи — это обратимое преобразование кодированных данных
которые могут (или не могут) включать текстовые данные, представленные в одном или нескольких
схемы кодировки символов.

Обычно TES проектируются для
преобразовать один поток байтов в другой, избегая при этом определенных значений байтов, которые могут запутать один или несколько Интернет или
другие протоколы передачи / хранения. Примеры включают base64, uuencode, BinHex,
и
цитируется-распечатывается.Хотя протоколы передачи данных часто включают сжатие данных, чтобы минимизировать количество битов
для передачи по каналу связи обычно выполняется сжатие
вне TES, например, с помощью таких протоколов, как pkzip, gzip или winzip.

Теги Internet Content-Transfer-Encoding «7bit» и «8bit» являются особыми случаями. Это спецификации ширины данных
имеют отношение в основном к почтовым протоколам и, похоже, предшествуют истинным TES
вроде цитируется-печатается. Обнаружение «7-битного» тега не
подразумевают любое фактическое преобразование данных; это просто указывает на то, что
кодировка данных может быть представлена ​​в 7 битах и ​​будет передавать 7-битные каналы
— это действительно указывает на форму кодировки. В отличие,
quoted-printable фактически преобразует различные символы (в том числе
некоторый ASCII) в формы типа «= 2D»
или «= 20», и следует
быть перевернутым при получении, чтобы восстановить разборчивый текст в обозначенном символе
схема кодирования.

Языки программирования определяют определенные типы данных для
символьные данные с использованием байтов или многобайтовых кодовых единиц. Например,
Тип данных char в Java или C # всегда использует 16-битные единицы кода, а размер char
и типы данных wchar_t в C и C ++, в пределах довольно гибких ограничений,
реализация определена.В Java или C # 16-битные кодовые единицы по определению
Единицы кода UTF-16, в то время как в C и C ++ привязка к определенному символу
набор снова до реализации. В Java строки — это непрозрачные данные
type, в то время как в C (и на самом низком уровне также в C ++) они представлены
как простые массивы char или wchar_t.

Модель Java поддерживает переносимые программы, но внешние данные в других
формы кодирования сначала необходимо преобразовать в UTF-16. Модель C / C ++
предназначен для поддержки байтового сериализованного набора символов с использованием данных char
тип, поддерживая набор символов с одной единицей кода на символ
с типом данных wchar_t.Эти два набора символов не обязательно должны быть
то же самое, но репертуар большего набора должен включать меньший набор для
разрешить отображение одного типа данных в другой. Это позволяет реализовать
поддерживать
UTF-8 как тип данных char и
UTF-32 как wchar_t
тип данных, например. При таком использовании тип данных char соответствует сериализованным данным.
для хранения и обмена, а тип данных wchar_t используется для внутренних
обработка. Нет никакой гарантии, что
wchar_t представляют символы определенного набора символов.Однако
стандартный макрос, __STDC_ISO_10646__ может использоваться средой для
обозначают, что он поддерживает конкретную версию 10646, обозначенную годом и
месяц.

Однако определение термина символа
в стандарте ISO C и C ++ не обязательно соответствует определению абстрактного
персонаж в этой модели. Многие широко используемые библиотеки и операционные системы определяют wchar_t как
Единицы кода UTF-16. Другие API, поддерживающие UTF-16, часто просто
определяется в терминах массивов 16-битных целых чисел без знака, но это делает
недоступны некоторые функции языка программирования, например строковые литералы.

ISO / IEC
TR 19769 расширяет модель, используемую в ISO C и C ++, рекомендуя использование
два определения типов и минимальное расширение поддержки символьных литералов
и библиотека времени выполнения. Типы данных char16_t и char32_t беззнаковые
целые числа, предназначенные для хранения одной кодовой единицы для UTF-16 или UTF-32 соответственно.
Как и wchar_t, они могут использоваться в общем для любого набора символов, но
предопределенные макросы __STDC_UTF_16__ и __STDC_UTF_32__ могут использоваться для
указывают, что тип данных char16_t или char32_t содержит блоки кода, которые
в соответствующей форме кодировки Unicode.

Когда
символьные типы данных передаются в качестве аргументов в API, порядок байтов
платформы обычно не имеет отношения к коду
единицы. Один и тот же API может быть скомпилирован на платформах с любым байтом.
полярность, и будет просто ожидать символьных данных (как и для любых целочисленных
data) для передачи в API в байтовой полярности для этой платформы. Однако размер типа данных должен соответствовать
размер кодовой единицы, иначе результаты могут быть непредсказуемыми, как если бы байт
ориентированный strcpy используется для данных UTF-16, которые могут содержать встроенный NUL
байты.

Пока есть много функций API
что по дизайну не нужно заботиться о том, какой набор символов кодовых единиц
соответствуют (например, strlen или strcpy), многие другие операции требуют
информация о персонаже и его свойствах. Как
Результат переносимые программы могут не использовать char или wchar_t
типы данных в C / C ++.

8.1 Струны

Строковый тип данных — это просто
последовательность кодовых единиц. Таким образом, 8-битная строка Unicode представляет собой последовательность
8-битные кодовые единицы Unicode; 16-битная строка Unicode — это последовательность 16-битных
кодовые единицы; 32-битная строка Unicode — это последовательность 32-битного кода
единицы.

В зависимости от среды программирования Unicode
Строка может также потребоваться или не быть в соответствующей форме кодировки Unicode. Например, струны
в Java, C # или ECMAScript — это 16-битные строки Unicode, но не обязательно
правильно сформированные последовательности UTF-16. При нормальной обработке часто бывает, что
строка может находиться в переходном состоянии, отличном от правильного формата UTF-16.
Поскольку строки являются фундаментальным компонентом каждой программы, их можно
гораздо эффективнее отложить проверку правильности.

Однако всякий раз, когда указывается, что строки находятся в определенном Unicode
кодирование — даже для строки с тем же размером кодовой единицы — не должно нарушать
требования этой формы кодирования. Например, изолированные суррогаты в 16-битном кодировке Unicode.
string не допускаются, если указана правильная строка UTF-16.

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

Архитектура представления символьных данных

Схема сжатия

ACR Репертуар абстрактных персонажей
API Интерфейс прикладного программирования
ASCII Американский стандартный код для обмена информацией
BE с прямым порядком байтов (сначала старший байт)
БМП Basic Multilingual Plane, первые 65 536 символов из 10646
BOCU Последовательное сжатие по байтам для Unicode
CCS Набор кодированных символов
CCSID Идентификатор набора кодовых символов
CDRA от IBM
CEF Форма кодировки символов
CEN Европейский комитет по стандартизации
CES Схема кодирования символов
CM Карта персонажей
CP Кодовая страница
CS Набор символов
DBCS Двухбайтовый набор символов
ECMA Европейская ассоциация производителей компьютеров
EBCDIC Расширенный двоично-десятичный код обмена
EUC Расширенный код Unix
GCGID Набор графических символов Глифический идентификатор
IAB Совет по архитектуре Интернета
IANA Управление по присвоению номеров Интернета
МЭК International Electrotechnical
Комиссия
IETF Инженерная группа Интернета
ISO Международная организация по стандартизации
JIS Японский промышленный стандарт
JTC1 Joint Technical
Комитет 1 (отвечает за ИТ-стандарты ISO / IEC)
LE Little-endian (сначала младший байт)
MBCS Многобайтовый набор символов (от 1 до n байтов на кодовую точку)
MIME Многоцелевые расширения почты Интернета
RFC Запрос комментариев (термин, используемый для стандарта Интернета)
RCSU Reuters для Unicode
(предшественник SCSU)
SBCS Набор однобайтовых символов
SCSU Стандартная схема сжатия для Unicode
ТЕС Синтаксис кодирования передачи
UCS Универсальный набор символов; Универсальный многооктетный кодированный символ
Набор — репертуар и кодировка, представленная ISO / IEC 10646-1: 1993 и его поправками.
УДК Пользовательский символ
UTF Формат преобразования Unicode (или UCS)

Технический отчет

-7

[10646] ISO / IEC 10646 — Универсальный набор символов с несколькими октетами, доступность
см.
http://www.iso.org
[Bidi] Стандартное приложение Unicode № 9:
Двунаправленный алгоритм

http://www.unicode.org/reports/tr9/
[BOCU] Unicode Technical Note # 6: BOCU-1: MIME-совместимое сжатие Unicode ,
http: // www.unicode.org/notes/tn6/
[Границы] Стандартное приложение Юникода № 29: Границы текста ,
http://www.unicode.org/reports/tr29/
[CDRA] Архитектура представления символьных данных
Справочник и реестр, Корпорация IBM, второе издание, декабрь 1995 г. IBM
документ SC09-2190-00
[CharMapML] Unicode № 22: символов
Mapping Markup Language
(CharMapML),
http: // www.unicode.org/reports/tr22/
[Кодировка] Назначение кодировки IANA
http://www.iana.org/assignments/character-sets
[Графики] Онлайн-таблицы кодов можно найти
на http://www.unicode.org/charts/
Указатель имен персонажей со ссылками на соответствующую таблицу:
можно найти на http://www.unicode.org/charts/charindex.html
[FAQ] Unicode Часто задаваемые вопросы
http: // www.unicode.org/faq/
Для ответов на общие вопросы по техническим вопросам.
[Обратная связь] Сообщение об ошибках и запросы
Информация онлайн

http://www. unicode.org/reporting.html
[Глоссарий] Глоссарий Unicode
http://www.unicode.org/glossary/
Для объяснения терминологии, используемой в этом и других документах.
[Lunde] Лунде, Кен, CJKV Information Processing,
О’Рейли, 1998, ISBN 1-565-
[PropModel] Технический отчет Unicode № 23: Модель свойств символов Unicode ,
http: // www.unicode.org/reports/tr23/
[Отчеты] Технические отчеты Unicode
http://www.unicode.org/reports/
Для получения информации о статусе и процессе разработки для
технические отчеты, а также список технических отчетов.
[RFC2130] Отчет о наборе символов IAB
Семинар состоялся 29 февраля 1 марта 1996 г. К. Вейдер и др., Апрель 1997 г.,
http://www.ietf.org/rfc/rfc2130.txt
[RFC2277] Политика IETF в отношении наборов символов и языков, H.Альвестран, январь 1998 г.,
http://www.ietf.org/rfc/rfc2277.txt
[RFC3492] RFC 3492: Punycode: кодировка начальной строки
Юникод для интернационализированных доменных имен в приложениях (IDNA)
, A.
Костелло, март 2003 г.,
http://www.ietf.org/rfc/rfc3492.txt
[SCSU] Технический стандарт Unicode № 6: Стандартная схема сжатия для Unicode,
http://www.unicode.org/reports/tr6/
[Стабильность] Политики стабильности Unicode,
http: // www.unicode.org/policies/
[UCD] База данных символов Unicode.
http://www.unicode.org/ucd/
Для обзора базы данных символов Unicode и списка
связанные с ним файлы
[Unicode] Стандарт Unicode
Последнюю версию см . :

http://www.unicode.org/versions/latest/.
Последнюю основную версию см .: Консорциум Unicode.
В
Стандарт Юникода, версия 4.0. (Бостон, Массачусетс, Аддисон-Уэсли, 2003.
0-321-18578-1) или онлайн как
http://www.unicode.org/versions/Unicode4.0.0/
[Unicode] Консорциум Unicode.
В
Стандарт Юникода, версия 4.0. Ридинг, Массачусетс, Эддисон-Уэсли, 2003.
0-321-18578-1.
[Версии] Версии стандарта Unicode
http://www.unicode.org/standard/versions/
Для получения информации о нумерации версий, цитировании и ссылках
стандарт Unicode, база данных символов Unicode и Unicode
Технические отчеты.
[W3CCharMod] Модель персонажа для
Всемирная паутина 1.0
,
http://www.w3.org/TR/charmod

Спасибо доктору Джули Аллен за обширное редактирование текста и множество предложений по
как улучшить читаемость, в частности раздела 2.

Начиная с версии 4:

Выровнял обсуждение TES для более точного соответствия
обычная практика. Улучшено обсуждение CES. Примечание: версии 4 и 3.3 были предложены обновления, которые
заменено. Отредактировал текст для стиля и ясности повсюду, помечен
цифры, изменил некоторые списки на таблицы, применил копи-правки. [AF]

Начиная с версии 3.3:

Улучшено обсуждение CES.
[AF]

Начиная с версии 3.2:

Обновлено для Unicode 4.0. Добавлены подразделы по управлению версиями,
Порядок байтов и строки. Расширил
обсуждение типов данных и API. Отредактировал текст для стиля
и ясность во всем.Переход на текущий формат TR. [AF]


Copyright © 1999-2004 Unicode, Inc. Все права защищены.
Консорциум Unicode не дает никаких явных или подразумеваемых гарантий любого рода, и
не несет ответственности за ошибки или упущения. Мы не несем ответственности за
случайные и косвенные убытки в связи с
использование информации или программ, содержащихся в данном техническом
отчет. Применяются Условия использования Unicode.

Unicode и логотип Unicode являются товарными знаками Unicode,
Inc., и зарегистрированы в некоторых юрисдикциях.

UTR # 17: Модель кодирования символов Unicode

Технический отчет Unicode № 17

Сводка

В этом документе разъясняется ряд терминов, используемых для описания
кодировки символов, и где подходят различные формы Unicode. Это
разрабатывает трехуровневую структуру Совета по архитектуре Интернета (IAB).
«Текстовый поток» в четырехуровневую структуру.

Статус

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

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

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

Содержание

  1. Модель кодировки символов
  2. Репертуар абстрактных персонажей
  3. Набор кодированных символов

  4. (CCS)
  5. Форма кодировки символов (CEF)
  6. Схема кодирования символов

  7. (CES)
  8. Карты персонажей
  9. Синтаксис кодирования передачи
  10. Типы данных и привязка API
  11. Определения и сокращения

В этом отчете описывается модель конструкции
кодировок символов. Модель кодировки символов Unicode помещает Unicode
Стандарт в контексте других кодировок символов всех типов, а также
существующие модели, такие как архитектура персонажей, продвигаемая Интернетом
Совет по архитектуре (IAB) для использования на
Интернет, или определенная Архитектура представления символьных данных [CDRA]
от IBM для организации и каталогизации собственного массива символов, зависящего от поставщика.
кодировки. В этом документе основное внимание уделяется тому, как эти модели должны быть расширены и
разъяснено, чтобы охватить все аспекты стандарта Unicode и ISO / IEC 10646
[10646].(Список общих сокращений, используемых в этом тексте, см.
Раздел 9
Определения и сокращения ).

Четыре уровня модели кодирования символов Юникода
можно резюмировать как:

  • ACR: Репертуар абстрактных персонажей
    • набор символов для кодирования, например, некоторый алфавит или
      набор символов
  • CCS: Набор кодированных символов
    • отображение репертуара абстрактного персонажа на набор
      неотрицательные целые числа
  • CEF: Форма кодирования символов
    • отображение набора неотрицательных целых чисел, которые являются элементами CCS
      к
      набор последовательностей определенных кодовых единиц определенной ширины,
      такие как 32-битные целые числа
  • CES: Схема кодирования символов
    • обратимое преобразование из набора последовательностей кодовых единиц (из одного или
      больше CEF для сериализованной последовательности байтов)

Помимо четырех отдельных уровней, есть еще два
полезные понятия:

  • CM: Таблица символов
    • отображение последовательностей
      члены репертуара абстрактных символов для сериализованных последовательностей байтов
      соединение всех четырех уровней за одну операцию
  • TES: Синтаксис кодирования передачи
    • обратимое преобразование закодированных данных, которое может или не может
      содержат текстовые данные

Модель IAB, как определено в [RFC 2130],
различает три уровня: Набор кодированных символов (CCS), Символ
Схема кодирования
(CES) и синтаксис кодирования передачи (TES). Тем не менее, четыре уровня должны быть
определены, чтобы адекватно охватить различия, необходимые для Unicode
модель кодировки символов. Один из них,
Репертуар абстрактных персонажей , неявно присутствует в
модель IAB. Модель Unicode также
дает TES отдельный
статус вне модели, добавляя дополнительный уровень между CCS и CES.

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

Репертуар из 2 абстрактных персонажей

Репертуар персонажей определяется как
неупорядоченный
набор абстрактных символов для кодирования. Слово abstract означает, что эти объекты определены условно. Во многих случаях
Репертуар состоит из знакомого алфавита или набора символов.

Репертуары бывают двух типов: фиксированные и открытые . В большинстве кодировок символов
репертуар фиксированный и часто небольшой. Один раз
репертуар определяется, его никогда не меняют. Добавление нового
абстрактный характер для данного репертуара создает новый
репертуар, которому затем будет присвоен собственный каталожный номер, составляющий
новый объект. Для стандарта Unicode, с другой стороны, репертуар по своей сути
открыто. Поскольку Unicode задуман как универсальная кодировка, любая абстрактная
символ, который когда-либо мог быть закодирован, потенциально является членом набора
кодировать, вне зависимости от того, известен ли этот символ в настоящее время или нет.

В некоторых других наборах символов используется ограниченное
понятие открытого репертуара. Например, у Microsoft есть
время от времени расширял репертуар наборов символов Windows
добавив несколько символов к существующему
репертуар. Это произошло, когда ЗНАК ЕВРО был добавлен к
репертуар для ряда наборов символов Windows, например. Для предложений о том, как сопоставить неназначенные символы открытых репертуаров, см. [CharMapML].

Репертуар — это объекты, которые получают CS
(«Набор символов») значения в IBM CDRA
архитектура.

Примеры репертуара персонажей:

  • японские слоговые и идеограммы
    JIS X 0208 (CS 01058)
    [фиксированный]
  • западноевропейские алфавиты и символы Latin-1 (CS 00697)
    [фиксированный]
  • репертуар переносимых персонажей POSIX [исправлено]
  • Японский репертуар хоста IBM (CS 01001) [исправлено]
  • Windows, западноевропейский репертуар [open]
  • репертуар Unicode / 10646 [открыть]

2.1 Управление версиями

Стандарт Unicode изменяет свой репертуар путем публикации основных и
второстепенные редакции стандарта: 1.0, 1.1, 2.0, 2.1, 3.0, … Репертуар для
каждая версия определяется перечислением абстрактных символов, включенных в
та версия.

Расширения репертуара для стандарта Unicode теперь строго аддитивны,
несмотря на то, что в самых ранних версиях (1. 0
и 1.1) влияющие на
обратная совместимость с ними из-за слияния
[Unicode] с [10646].Начиная с версии 2.0, стабильность кодировки символов Unicode
Политика [Стабильность] гарантирует, что нет
персонаж всегда удаляется из репертуара.

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

Версия репертуара отличается от
управление версиями стандарта Unicode в целом, в частности символа Unicode
База данных [UCD], которая определяет свойства персонажа (см. Также
[PropModel]). Есть версии обновления текста Unicode
Standard и базы данных символов Unicode между основной и дополнительной версиями
стандарт Юникода. Хотя эти версии обновления могут изменять свойства персонажей и
описания поведения персонажа, они не добавляют в репертуар персонажа.Для получения дополнительной информации о версиях стандарта Unicode см.
Версии стандарта Unicode
[Версии].

ISO / IEC 10646 расширяет свой репертуар за счет формального процесса внесения поправок. Как каждый человек
опубликована поправка, содержащая дополнительные символы,
расширяет репертуар 10646.
Репертуар стандарта Unicode и ISO / IEC 10646:
согласовано, координируя публикацию основных версий
стандарта Unicode с публикацией четко определенного списка поправок
для 10646 или с серьезным пересмотром и переизданием 10646.

2.2 Персонажи и символы

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

Символы не соответствуют друг другу с символами. Например,
последовательность «f», , за которой следует «i» может отображаться с одним
глиф, называемый лигатурой fi. Обратите внимание, что фигуры объединены
вместе, и точка отсутствует в «i»
как показано на рисунке 2.

Рисунок 2
Последовательность символов Образец символа

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

Рисунок 3
Последовательность символов Возможная последовательность символов


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

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

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

Рисунок 6
Персонаж Последовательность знаков

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

Рисунок 7
Персонаж Разделить символы

соответствие между глифами и символами, как правило, не
один к одному и не может быть предсказан только по тексту.Будь
конкретная строка символов отображается определенной последовательностью глифов
будет зависеть от сложности операционной системы хоста и шрифта. В
порядок глифов также не обязательно соответствует порядку
символы. В частности, буквы с написанием справа налево, такие как арабский и иврит.
приводят к сложному переупорядочиванию. См. UAX # 9: .
Двунаправленный алгоритм Unicode

[Биди].

2.3 Совместимые символы

По историческим причинам репертуар абстрактных персонажей может включать в себя множество
объекты, не считающиеся соответствующими членами аннотации
репертуар персонажей.Эта так называемая совместимость
символы могут включать
лигатурные глифы, глифы контекстной формы, глифы, которые различаются по ширине, последовательности
символов и украшенных глифов, например чисел в кружках. Списки на рис.8
немного
примеры, в которых они закодированы как отдельные символы в Юникоде. Как и с
глифы, между символами не обязательно есть взаимно однозначные отношения
и кодовые точки.

То, что конечный пользователь считает одним символом (также называемым кластером графем
в контексте Unicode)
фактически может быть представлен несколькими кодовыми точками; и наоборот, единый код
точка может соответствовать нескольким символам.Вот несколько примеров:

Для получения дополнительной информации о границах кластера графем см. UAX # 29:
Сегментация текста Unicode [Границы].

2.4 Подмножества

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

Механизмы формального подмножества иногда встречаются в реализациях некоторых
Наборы азиатских символов, где, например, различие между «Уровень 1
JIS »и« Уровень 2 JIS »относится к определенным частям
репертуар символов кандзи JIS X 0208, который будет включен в
выполнение.

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

Европейский комитет по стандартизации (CEN)
определил несколько многоязычных европейских подмножеств ISO / IEC 10646-1 (называемых MES-1,
MES-2, MES-3A и MES-3B). MES-1 и MES-2 были добавлены как именованные фиксированные коллекции.
в 10646.

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

Набор кодированных символов определяется как отображение из набора
абстрактные символы к множеству неотрицательных целых чисел. Этот диапазон
целые числа не обязательно должны быть смежными. В стандарте Unicode концепция
скалярного значения Unicode (см. определение D76 в главе 3 «Соответствие»
[Unicode])
явно определяет такой несмежный диапазон целых чисел.

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

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

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

В архитектуре IBM CDRA
Значения CP («кодовой страницы») относятся к закодированным
наборы символов. Обратите внимание, что такое использование термина кодовая страница вполне допустимо.
точный и ограниченный. Это не должно быть — но обычно — путаться
с общим использованием кодовой страницы для обозначения символа
схемы кодирования.

Примеры наборов кодированных символов:

Имя Репертуар
JIS X 0208 присваивает пары целых чисел, известные как kuten очков
ISO / IEC 8859-1 ASCII плюс Latin-1
ISO / IEC 8859-2 другой репертуар, чем 8859-1, хотя оба используют один и тот же
кодовое пространство
Кодовая страница 037 тот же репертуар, что и 8859-1; разные целые числа, присвоенные
одинаковый
персонажи
Кодовая страница 500 тот же репертуар, что и 8859-1, и кодовая страница 037; разные целые числа
Стандарт Unicode, версия 2.0 точно такой же репертуар и отображение
ISO / IEC 10646-1: 1993
плюс поправки 1-7
Стандарт Unicode, версия 3.0 точно такой же репертуар и отображение
ISO / IEC 10646-1: 2000
Стандарт Unicode, версия 4.0 точно такой же репертуар и отображение
ISO / IEC 10646: 2003

Этот документ не пытается перечислить все версии
стандарт Юникода.Посмотреть версии
стандарт Unicode [версии] для полного списка
версий и информацию о том, как они соответствуют конкретным версиям и
поправки к 10646.

3.1 Именование символов

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

Основное обоснование практики именования персонажей в SC2 состоит в том, чтобы
механизм для однозначной идентификации абстрактных персонажей в разных
репертуары с разными отображениями на целые числа в разном кодированном символе
наборы. Таким образом, ЛАТИНСКАЯ СТРОЧНАЯ БУКВА А С ТЯЖЕЛЫМ
то же
абстрактный характер, хотя и встречается в разных репертуарах
и является
присвоили разные целые числа в разных наборах кодированных символов.

IBM CDRA [CDRA], с другой стороны, обеспечивает
идентичность символов в различных наборах кодированных символов (или кодовых страниц ) путем присвоения каталожного номера
известный как GCGID (графический символ
глифический идентификатор) для каждого абстрактного символа, используемого в любом из
репертуар составлен CDRA.Абстрактные символы, имеющие одинаковые
GCGID в двух разных наборах кодированных символов по определению одинаковы
персонаж. Другие поставщики использовали аналогичные системы внутренней идентификации.
для абстрактных персонажей.

Появление Unicode / 10646 в значительной степени сделало такие схемы устаревшими. В
идентичность абстрактных символов во всех других наборах кодированных символов
все больше определяется ссылкой на Unicode / 10646. Часть
давление, чтобы включить каждый «символ» из всех существующих закодированных
набор символов в стандарт Unicode является результатом желания получить
избавиться от вспомогательных механизмов для отслеживания деталей, которые
не являются частью Unicode, а вместо этого просто используйте Unicode
Стандарт как универсальный каталог персонажей.

3.2 Кодовые пространства

Диапазон неотрицательных целых чисел, используемых для отображения абстрактных
Символы определяют связанную концепцию кодового пространства . Традиционный
границы для типов пространств кода тесно связаны с формами кодирования
(см. ниже), поскольку отображение абстрактных символов в неотрицательные целые числа
выполняются с учетом конкретных форм кодирования. Примеры
значимых кодовых пространств: 0..7F, 0..FF, 0..FFFF, 0..10FFFF, 0..7FFFFFFF,
0..FFFFFFFF.

Кодовые пространства могут также иметь сложную структуру, в зависимости от
является ли диапазон целых чисел непрерывным или
определенные диапазоны значений запрещены. Результат большинства осложнений
из соображений формы кодирования символов. Когда в форме кодирования указано, что
кодируемые целые числа должны быть сериализованы как последовательности байтов, есть
часто накладываются ограничения на конкретные значения, которые могут иметь эти байты.
Чаще всего такие ограничения запрещают байтовые значения, соответствующие функциям управления.С точки зрения кода
пространство, такие ограничения на байтовые значения приводят к нескольким несмежным диапазонам целых чисел, которые запрещены для
отображение репертуара персонажей. (См. [Lunde] для
двумерные диаграммы типичных кодовых пространств для восточноазиатских кодированных символов
наборы, реализующие такие ограничения.)

Примечание: В ISO
По стандартам термин октет используется для 8-битного байта. В этом документе
термин байт используется последовательно только для 8-битного байта.

Форма кодировки символов — это отображение набора используемых целых чисел.
в CCS к набору последовательностей кодовых единиц.А
кодовая единица — это
целое число, занимающее заданную двоичную ширину в компьютерной архитектуре, например
8-битный байт. Форма кодирования позволяет представлять символы как актуальные.
данные в компьютере. Последовательности кодовых единиц не обязательно имеют
такая же длина.

  • Форма кодировки символов, все последовательности которой имеют одинаковую длину:
    известная как с фиксированной шириной .
  • Форма кодировки символов, последовательности которой не имеют одинаковой длины
    известна как переменной ширины .

Форма кодировки символов для набора кодированных символов определяется как
форма кодировки символов, которая отображает все закодированные символы для этого
кодированный набор символов.

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

При интерпретации последовательности кодовых единиц есть три возможности:

  1. Последовательность плохо сформирована .

    Последовательность
    неполный или иным образом не соответствует
    спецификация формы кодирования. Например,

    • 0xA3 не завершен в CP950.
      Если за ним не следует другой байт правильной формы, это
      плохо сформированный.
    • 0xD800 является неполным в UTF-16.
      Если за ним не следует другое 16-битное значение правильной формы, оно
      плохо сформированный.
    • 0xC0 неправильно сформирован в UTF-8. Это не может быть начальный байт (или, если на то пошло,
      любой байт) правильно сформированной последовательности UTF-8.

    Подробнее о неправильно сформированных последовательностях для UTF-8 и UTF-16 см.
    см. Раздел 3.9, Формы кодирования Unicode, в [Unicode].

  2. Последовательность представляет собой действительный код, но — неназначенный .
    Эта последовательность может получить задание в будущем, эволюционировала
    версия кодировки символов.Для предложений о том, как
    обрабатывать неназначенные символы при отображении, см. [CharMapML].
    Например,

    • 0xA3 0xBF не назначен в CP950 по состоянию на 1999 год.
    • 0x0EDE не назначен в Unicode 5.0
  3. Исходной последовательности присвоено : она представляет действительный закодированный
    персонаж. Есть три варианта этого:
    Первый — типичный назначенный символ. Например,

    • 0x0EDD назначается в Unicode 5.0

    Второй вариант — это пользовательский символ.Например,

    • 0xE000 — это назначенный пользователем символ, семантический
      интерпретация оставлена ​​на усмотрение сторон за пределами
      контекст стандарта.

    Третий тип характерен для стандарта Unicode: несимвольный . Это
    вид определяемого пользователем символа для внутреннего использования, не предназначенный для публичного обмена. Например,

    • 0xFFFF — назначенный несимвол в Unicode 5.0

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

Формы кодирования бывают разных типов. Некоторые из них являются эксклюзивными для
Unicode / 10646, тогда как другие представляют общие шаблоны, которые повторяются
снова и снова для сотен кодированных наборов символов. Некоторые из наиболее важных
примеры форм кодирования следуют.

Примеры форм кодирования фиксированной ширины:

Пример

Пример

Тип Каждый символ
закодирован как
Банкноты
7-битный одно 7-битное количество пример: ISO 646
8-битный G0 / G1 одно 8-битное количество с ограничениями на использование пространств C0 и C1
8-битный одно 8-битное количество без ограничений по использованию пространства C1
8-битный EBCDIC одно 8-битное количество с соглашениями EBCDIC, а не
Условные обозначения ASCII
16-бит (UCS-2) одно 16-битное количество в кодовом пространстве 0..FFFF
32-бит (UCS-4) одно 32-битное количество в кодовом пространстве 0..7FFFFFFF
32-разрядная (UTF-32) одно 32-битное количество в кодовом пространстве 0..10FFFF
16-битный код процесса DBCS одно 16-битное количество: UNIX widechar реализации азиатского CCS
32-битный код процесса DBCS одно 32-битное количество: UNIX widechar реализации азиатского CCS
Хост DBCS две 8-битные величины в соответствии с соглашениями о хостах IBM

Примеры форм кодирования переменной ширины:

Имя Символы кодируются как Банкноты
UTF-8 сочетание от одной до четырех 8-битных кодовых единиц
в Unicode
и от одной до шести кодовых единиц в 10646
используется только с Unicode / 10646
UTF-16 сочетание от одной до двух 16-битных кодовых единиц используется только с Unicode / 10646

Форма кодирования определяет один из фундаментальных аспектов
кодировки: сколько кодовых единиц существует для каждого символа.В
количество кодовых единиц на символ важно для интернационализированного программного обеспечения. Раньше
это было эквивалентно тому, сколько байтов каждый символ
был представлен. С введением Unicode и 10646 более широкого кода
агрегаты для UCS-2,
UTF-16,
UCS-4 и UTF-32, это обобщено на две части
информации: указание ширины кодовой единицы и
количество кодовых единиц, используемых для представления каждого символа.
Форма кодирования UCS-2, связанная с
ISO / IEC 10646 и может выражать только символы в
БМП,
это форма кодирования с фиксированной шириной.Напротив, UTF-16 использует один или два кода.
единиц и может покрывать все кодовое пространство Unicode.

UTF-8 является хорошим примером. В UTF-8 основная кодовая единица, используемая для представления символьных данных, составляет 8 бит.
широкий (то есть байт или октет). Карта ширины для UTF-8:

0x00..0x7F 1 байт
0x80..0x7FF 2 байта
0x800..0xD7FF, 0xE000..0xFFFF 3 байта
0x10000 .. 0x10FFFF 4 байта

Примеры форм кодирования применительно к конкретным наборам кодированных символов:

Форма кодировки

Имя Формы кодирования
JIS X 0208 обычно преобразовывается из нотации kuten в форму кодирования 16-битного «кода JIS», для
пример «nichi», 38 92 (kuten) → 0x467C Код JIS
ISO 8859-1 имеет 8-битную форму кодирования G0 / G1
CP 037 8-битная форма кодирования EBCDIC
CP 500 8-битная форма кодирования EBCDIC
US ASCII 7-битная кодировка формы
ISO 646 7-битная кодировка формы
Окна CP 1252 8-битная кодировка формы
Юникод 4.0, 5.0 UTF-16, UTF-8 или UTF-32
Юникод 3.0 либо форма кодировки UTF-16 (по умолчанию), либо UTF-8
Юникод 1.1 форма кодировки UCS-2 (по умолчанию) или UTF-8
ISO / IEC 10646: 2003 в зависимости от заявленных уровней реализации может иметь UCS-2,
UCS-4, UTF-16 или UTF-8.
ISO / IEC 10646: 2009 UTF-8, UTF-16 или UTF-32

Примечание. Shift-JIS не является формой кодирования.Это обсуждается в
следующий раздел.

Примечание: Ожидается повторная публикация ISO / IEC 10646
2-е издание (ISO / IEC 10646: 2009) снизит уровни реализации, а его
использование и обсуждение форм кодировки символов будет тесно связано с
Юникод 5.0.

Схема кодировки символов (CES) — это
обратимое преобразование последовательностей кодовых единиц в последовательности байтов в одном из
три пути:

1. простой CES использует отображение каждого
кодовая единица CEF в уникальный сериализованный
последовательность байтов по порядку.

2. Состав CES использует два или более простых CES, а также механизм переключения
между ними. Этот механизм включает байты (например, одиночные смены, SI / SO или
escape-последовательности), которые не являются частью каких-либо простых CES, но которые
определяется архитектурой кодировки символов и может потребовать внешнего
реестр конкретных значений (например, для управляющих последовательностей ISO 2022).

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

3. A сжатие
CES сопоставляет последовательность кодовых единиц с
последовательность байтов при минимизации длины последовательности байтов. Немного
сжатия CES предназначены для создания уникальной последовательности байтов для
каждую последовательность кодовых единиц, так что сжатые байтовые последовательности могут
сравниваться на равенство или упорядочиваться путем двоичного сравнения.Другой
сжатие CES просто обратимо.

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

  • Большинство форм байтового кодирования фиксированной ширины имеют тривиальное отображение
    в CES: каждое 7-битное или 8-битное количество отображается в байт того же значения.
  • Большинство форм байтового кодирования смешанной ширины также просто сериализуют
    последовательность CC-элементов данных в байты.

    • UTF-8 следует этому шаблону, потому что он уже ориентирован на байты
      форма кодирования.
    • UTF-16 должен указывать порядок байтов для сериализации байтов, поскольку он включает в себя 16-битные величины.
      Порядок байтов — единственное различие между UTF-16BE,
      в котором два байта 16-битного количества сериализованы в
      обратный порядок байтов и UTF-16LE, в котором они сериализованы в
      порядок обратного порядка байтов.

Важно не путать форму кодировки символов (CEF) и CES.

  1. CEF сопоставляет кодовые точки с кодовыми единицами, в то время как CES
    преобразует последовательности кодовых единиц в
    байтовые последовательности. (Для прямого отображения символов в сериализованные байты см.
    Раздел 6 Карты символов .)
  2. CES должен учитывать байтовый порядок сериализации всего кода.
    единицы шире байта, которые используются в CEF.
  3. В остальном идентичные CES могут отличаться другими аспектами, такими как количество определяемых пользователем
    допустимые символы. (Это, в частности, относится к IBM
    CDRA
    архитектура, которая может отличать хост
    CCSID в зависимости от того, установлен ли
    УДК можно конвертировать в соответствующую кодовую страницу или
    нет.)

Некоторые схемы кодирования Unicode имеют те же метки, что и
три Unicode
кодирование форм. При использовании без уточнения термины UTF-8, UTF-16 и
UTF-32 являются
двусмысленный
между их смыслом как формы кодирования Unicode и как схемы кодирования Unicode.Эта двусмысленность обычно безобидна для UTF-8, потому что схема кодирования UTF-8
тривиально
полученный из последовательностей байтов, определенных для формы кодирования UTF-8.
Однако для UTF-16 и UTF-32 неоднозначность более проблематична. Как формы кодирования,
UTF-16 и
UTF-32 относится к кодовым единицам, поскольку они
доступны из памяти через
16-битные или 32-битные типы данных; нет связанного байта
ориентация и спецификация
никогда не используется. (Просмотр памяти в
отладчик или преобразование более широких типов данных в байтовые массивы — это байтовая сериализация.)

В качестве кодировки схемы , UTF-16 и UTF-32 относятся к сериализованным
байтов, например сериализованные байты для
потоковая передача данных или в файлах; они могут иметь как байтовую ориентацию, так и
одна спецификация может быть
присутствует в начале данных. Когда использование
сокращенные обозначения UTF-16 или UTF-32 могут быть
неправильно истолковано, и
где различие между их использованием в отношении форм кодирования Unicode
или для схем кодирования Unicode важно, следует использовать полные термины.Например, используйте
Форма кодировки UTF-16 или UTF-16
схема кодирования
. Они также могут быть сокращены до UTF-16 CEF или UTF-16 CES,
соответственно.

Примеры схем кодирования символов Unicode:

  • Стандарт Unicode имеет семь схем кодирования символов:
    UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE и UTF-32LE.

    • UTF-8, UTF-16BE, UTF-16LE, UTF-32BE и UTF32-LE — это простые CES.
    • UTF-16 и UTF-32 — составные CES, состоящие из
      одиночный, необязательный знак порядка байтов
      в начале данных следует простой CES.

      Имя CEF CES
      UTF-8 + простой
      UTF-16 + соединение
      UTF-16BE простой
      UTF-16LE простой
      UTF-32 + соединение
      UTF-32BE простой
      UTF-32LE простой

  • Юникод 1.1 имел три схемы кодировки символов: UTF-8, UCS-2BE и
    UCS-2LE, хотя в то время два последних так не назывались.

Примеры символов, отличных от Unicode
Схемы кодирования:

  • кодировки на основе ISO 2022 (ISO-2022-JP, ISO-2022-KR и т. Д.), Которые используют
    встроенные escape-последовательности; эти
    являются составными CES.
  • DBCS
    Shift (смесь одного однобайтового CCS, например
    JIS X 0201 и DBCS CCS,
    например на основе JIS X0208, с числовым сдвигом целочисленных значений),
    за
    Например, кодовая страница 932 в Windows.
  • EUC (аналогично кодировкам DBCS Shift, с применением
    различные правила числового сдвига и введение односменных байтов:
    0x8E и 0x8F, которые могут вводить 3-байтовые и 4-байтовые последовательности), для
    например, EUC-JP или EUC-TW в UNIX.
  • IBM host смешанные кодовые страницы для азиатских наборов символов, которые формально смешивают два
    отдельные CCS с соглашениями о переключении SI / SO, например,
    CCSID
    5035 на японских хост-машинах IBM.

Примеры сжатия символов
Схемы кодирования:

  • BOCU-1, см.
    Техническое примечание Unicode № 6:
    BOCU-1: MIME-совместимое сжатие Unicode .[BOCU].
    BOCU-1 отображает каждую входную строку в уникальную сжатую строку, но не отображает каждую кодовую единицу в уникальную серию байтов.
  • Punycode, определенный в [RFC3492],
    как и BOCU-1, уникален только на строковой основе.
  • SCSU (и
    RCSU): см.
    UTR # 6: Стандартная схема сжатия для Unicode
    [SCSU]. Входными данными в SCSU и RCSU является поток кодовых единиц; вывод представляет собой сжатый поток байтов.
    Из-за эвристики сжатия одна и та же входная строка может приводить к разным байтовым последовательностям, но схемы полностью
    обратимый.

Порядок 5,1 байта

Архитектура процессоров

отличается тем, что многобайтовые
машинные целые числа отображаются в места хранения. Little Endian архитектуры положить
младший байт в младшем адресе, а Big Endian архитектуры
начать со старшего байта.

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

По внешнему обозначению потоков данных три
можно выделить типы байтовых порядков: Big Endian (BE) ,
с прямым порядком байтов (LE)
и по умолчанию или с внутренней маркировкой .

В Юникоде символ в кодовой точке U + FEFF определяется как
метка порядка байтов , в то время как его обратный байтовый аналог, U + FFFE является
несимвольный (U + FFFE) в UTF-16 или за пределами кодового пространства (0xFFFE0000) для UTF-32. Во главе потока данных
поэтому наличие метки порядка байтов может использоваться для однозначной сигнализации байта
порядок кодовых единиц.

Отображение из последовательности
члены репертуара абстрактного персонажа сериализованной последовательности
байтов называется картой символов (CM).Простая карта символов
таким образом, неявно включает CCS,
CEF и CES, отображение из аннотации
символы для кодирования единиц в байты. Составная карта символов включает
соединение CES и, таким образом, включает более одного CCS и CEF. В этом случае
репертуар абстрактных персонажей для карты персонажей — это объединение
репертуар, охватываемый задействованными кодированными наборами символов.

Технический отчет

Unicode № 22:
Язык разметки отображения символов
[CharMapML] определяет спецификацию XML для
представляющие детали карт персонажей.В тексте также подробно обсуждаются вопросы картографии.
между наборами символов.

Карты персонажей — это сущности, которые получают
Кодировка IANA
[Кодировка]
идентификаторы в архитектуре IAB. От
Точка зрения кодировки IANA
это важно что
последовательность закодированных символов однозначно отображается на последовательность
байтов по кодировке. Кодировка должна быть указана во всех случаях, как в
Интернет-протоколы, в которых текстовое содержимое рассматривается как упорядоченная последовательность
байтов, и где текстовое содержимое должно быть реконструировано из этого
последовательность байтов.

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

Во многих случаях одно и то же имя используется как для карты символов, так и для
схема кодировки символов, например UTF-16BE. Обычно это делается для простых
отображение символов, когда такое использование ясно из контекста.

Синтаксис кодирования передачи — это обратимое преобразование кодированных данных
которые могут (или не могут) включать текстовые данные, представленные в одном или нескольких
схемы кодировки символов.

Обычно TES проектируются для
преобразовать один поток байтов в другой, избегая при этом определенных значений байтов, которые могут запутать один или несколько Интернет или
другие протоколы передачи / хранения. Примеры включают base64, uuencode, BinHex,
и
цитируется-распечатывается.Хотя протоколы передачи данных часто включают сжатие данных, чтобы минимизировать количество битов
для передачи по каналу связи обычно выполняется сжатие
вне TES, например, с помощью таких протоколов, как pkzip, gzip или winzip.

Теги Internet Content-Transfer-Encoding «7bit» и «8bit» являются особыми случаями. Это спецификации ширины данных
которые относятся к почтовым протоколам и, по-видимому, предшествуют истинным TES
вроде цитируется-печатается. Обнаружение «7-битного» тега не
подразумевают любое фактическое преобразование данных; это просто указывает на то, что
кодировка данных может быть представлена ​​в 7 битах и ​​будет передавать 7-битные каналы — это действительно
указывает форму кодирования.В отличие,
quoted-printable фактически преобразует различные символы (в том числе
некоторый ASCII) в формы типа «= 2D»
или «= 20», и следует
быть перевернутым при получении, чтобы восстановить разборчивый текст в обозначенном символе
схема кодирования.

Языки программирования определяют определенные типы данных для
символьные данные с использованием байтов или многобайтовых кодовых единиц. Например,
Тип данных char в Java или C # всегда использует 16-битные единицы кода, а размер char
и типы данных wchar_t в C и C ++, в пределах довольно гибких ограничений,
реализация определена.В Java или C # 16-битные кодовые единицы по определению
Единицы кода UTF-16, в то время как в C и C ++ привязка к определенному символу
набор снова до реализации. В Java строки — это непрозрачные данные
type, в то время как в C (и на самом низком уровне также в C ++) они представлены
как простые массивы char или wchar_t.

Модель Java поддерживает переносимые программы, но внешние данные в других
формы кодирования сначала необходимо преобразовать в UTF-16. Модель C / C ++
предназначен для поддержки байтового сериализованного набора символов с использованием данных char
тип, поддерживая набор символов с одной единицей кода на символ
с типом данных wchar_t.Эти два набора символов не обязательно должны быть
то же самое, но репертуар большего набора должен включать меньший набор для
разрешить отображение одного типа данных в другой. Это позволяет реализовать
поддерживать
UTF-8 как тип данных char и
UTF-32 как wchar_t
тип данных, например. При таком использовании тип данных char соответствует сериализованным данным.
для хранения и обмена, а тип данных wchar_t используется для внутренних
обработка. Нет никакой гарантии, что
wchar_t представляют символы определенного набора символов.Однако
стандартный макрос, __STDC_ISO_10646__ может использоваться средой для
обозначают, что он поддерживает конкретную версию 10646, обозначенную годом и
месяц.

Однако определение термина символа
в стандарте ISO C и C ++ не обязательно соответствует определению абстрактного
персонаж в этой модели. Многие широко используемые библиотеки и операционные системы определяют wchar_t как
Единицы кода UTF-16. Другие API, поддерживающие UTF-16, часто просто
определяется в терминах массивов 16-битных целых чисел без знака, но это делает
недоступны некоторые функции языка программирования, например строковые литералы.

ISO / IEC
TR 19769 расширяет модель, используемую в ISO C и C ++, рекомендуя использование
два определения типов и минимальное расширение поддержки символьных литералов
и библиотека времени выполнения. Типы данных char16_t и char32_t беззнаковые
целые числа, предназначенные для хранения одной кодовой единицы для UTF-16 или UTF-32 соответственно.
Как и wchar_t, они могут использоваться в общем для любого набора символов, но
предопределенные макросы __STDC_UTF_16__ и __STDC_UTF_32__ могут использоваться для
указывают, что тип данных char16_t или char32_t содержит блоки кода, которые
в соответствующей форме кодировки Unicode.

Когда
символьные типы данных передаются в качестве аргументов в API, порядок байтов
платформы обычно не имеет отношения к коду
единицы. Один и тот же API может быть скомпилирован на платформах с любым байтом.
полярность, и будет просто ожидать символьных данных (как и для любых целочисленных
data) для передачи в API в байтовой полярности для этой платформы. Однако размер типа данных должен соответствовать
размер кодовой единицы, иначе результаты могут быть непредсказуемыми, как если бы байт
ориентированный strcpy используется для данных UTF-16, которые могут содержать встроенный NUL
байты.

Пока есть много функций API
которые разработаны, чтобы не заботиться о том, какой набор символов кодовых единиц
соответствуют (например, strlen или strcpy), многие другие операции требуют
информация о персонаже и его свойствах. Как
в результате переносимые программы могут не использовать char или wchar_t
типы данных в C / C ++.

8.1 Струны

Строковый тип данных — это просто
последовательность кодовых единиц. Таким образом, 8-битная строка Unicode представляет собой последовательность
8-битные кодовые единицы Unicode; 16-битная строка Unicode — это последовательность 16-битных
кодовые единицы; 32-битная строка Unicode — это последовательность 32-битного кода
единицы.

В зависимости от среды программирования Unicode
Строка может также потребоваться или не быть в соответствующей форме кодировки Unicode. Например, струны
в Java, C # или ECMAScript — это 16-битные строки Unicode, но не обязательно
правильно сформированные последовательности UTF-16. При нормальной обработке часто бывает, что
строка может находиться в переходном состоянии, отличном от правильного формата UTF-16.
Поскольку строки являются фундаментальным компонентом каждой программы, их можно
гораздо эффективнее отложить проверку правильности.

Однако всякий раз, когда указывается, что строки находятся в определенном Unicode
кодирование — даже с тем же размером кодовой единицы — строка не должна нарушать
требования этой формы кодирования. Например, изолированные суррогаты в 16-битном кодировке Unicode.
string не допускаются, если указана правильная строка UTF-16.

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

Архитектура представления символьных данных

Схема сжатия

ACR Репертуар абстрактных персонажей
API Интерфейс прикладного программирования
ASCII Американский стандартный код для обмена информацией
BE с прямым порядком байтов (сначала старший байт)
БМП Basic Multilingual Plane, первые 65 536 символов из 10646
BOCU Последовательное сжатие по байтам для Unicode
CCS Набор кодированных символов
CCSID Идентификатор набора кодовых символов
CDRA от IBM
CEF Форма кодировки символов
CEN Европейский комитет по стандартизации
CES Схема кодирования символов
CM Карта персонажей
CP Кодовая страница
CS Набор символов
DBCS Двухбайтовый набор символов
ECMA Европейская ассоциация производителей компьютеров
EBCDIC Расширенный двоично-десятичный код обмена
EUC Расширенный код Unix
GCGID Набор графических символов Глифический идентификатор
IAB Совет по архитектуре Интернета
IANA Управление по присвоению номеров Интернета
МЭК International Electrotechnical
Комиссия
IETF Инженерная группа Интернета
ISO Международная организация по стандартизации
JIS Японский промышленный стандарт
JTC1 Joint Technical
Комитет 1 (отвечает за ИТ-стандарты ISO / IEC)
LE Little-endian (сначала младший байт)
MBCS Многобайтовый набор символов (от 1 до n байтов на кодовую точку)
MIME Многоцелевые расширения почты Интернета
RFC Запрос комментариев (термин, используемый для стандарта Интернета)
RCSU Reuters для Unicode
(предшественник SCSU)
SBCS Набор однобайтовых символов
SCSU Стандартная схема сжатия для Unicode
ТЕС Синтаксис кодирования передачи
UCS Универсальный набор символов; Универсальный многооктетный кодированный символ
Набор — репертуар и кодировка, представленная ISO / IEC 10646: 2003 и его поправками.
УДК Пользовательский символ
UTF Формат преобразования Unicode (или UCS)

Стандартное приложение

Технический отчет

-7

[10646] ISO / IEC 10646 — Универсальный набор символов с несколькими октетами.
Доступность см.
http://www.iso.org
[Bidi] Unicode # 9: Unicode
Двунаправленный алгоритм

http: //www.unicode.org / reports / tr9 /
[BOCU] Unicode Technical Note # 6: BOCU-1: MIME-совместимое сжатие Unicode
http://www.unicode.org/notes/tn6/
[Границы] Стандартное приложение № 29 Unicode: Сегментация текста Unicode
http://www.unicode.org/reports/tr29/
[CDRA] Архитектура представления символьных данных
Справочник и реестр, IBM Corporation
http: // www.ibm.com/software/globalization/cdra/index.jsp
[CharMapML] Unicode № 22: символов
Mapping Markup Language
(CharMapML)
http://www.unicode.org/reports/tr22/
[Кодировка] Назначение кодировки IANA
http://www.iana.org/assignments/character-sets
[Графики] Онлайн-таблицы кодов можно найти
на http://www.unicode.org/charts/
Указатель имен персонажей со ссылками на соответствующую таблицу:
найдено по адресу http: // www.unicode.org/charts/charindex.html
[FAQ] Unicode Часто задаваемые вопросы
http://www.unicode.org/faq/
Для ответов на общие вопросы по техническим вопросам.
[Обратная связь] Сообщение об ошибках и запросы
Информация онлайн

http://www.unicode.org/reporting.html
[Глоссарий] Глоссарий Unicode
http: //www.unicode.org / glossary /
За пояснениями терминологии, используемой в этом и других документах.
[Lunde] Лунде, Кен, CJKV Information Processing,
О’Рейли, 1999, ISBN 1-565-
[PropModel] Технический отчет Unicode № 23: Модель свойств символов Unicode
http://www.unicode.org/reports/tr23/
[Отчеты] Технические отчеты Unicode
http: // www.unicode.org/reports/
Для получения информации о статусе и процессе разработки для
технические отчеты, а также список технических отчетов.
[RFC2130] Отчет о наборе символов IAB
Семинар состоялся 29 февраля 1 марта 1996 г. К. Вейдер и др., Апрель 1997 г.
http://www.ietf.org/rfc/rfc2130.txt
[RFC2277] Политика IETF в отношении наборов символов и языков, Х. Альвестранд, январь 1998 г.
http: // www.ietf.org/rfc/rfc2277.txt (BCP 18)
[RFC3492] RFC 3492: Punycode: кодировка начальной строки
Юникод для интернационализированных доменных имен в приложениях (IDNA)
, A.
Костелло, март 2003 года
http://www.ietf.org/rfc/rfc3492.txt
[SCSU] Технический стандарт Unicode № 6: Стандартная схема сжатия для Unicode
http://www.unicode.org/reports/tr6/
[Стабильность] Политика стабильности кодировки символов Юникода
http: // www.unicode.org/policies/stability_policy.html
[UCD] База данных символов Юникода
http://www.unicode.org/ucd/
Для обзора базы данных символов Юникода и списка
связанные с ним файлы
[Unicode] Стандарт Unicode
Последнюю версию см .:

http://www.unicode.org/versions/latest/.
Последнюю основную версию см .: Консорциум Unicode.В
Стандарт Юникода, версия 5.0. Бостон, Массачусетс, Эддисон-Уэсли, 2007.
ISBN 0-321-48091-0.
Или онлайн как:
http://www.unicode.org/versions/Unicode5.0.0/
[Unicode5.0] Консорциум Unicode.
В
Стандарт Юникода, версия 5.0. Бостон, Массачусетс, Эддисон-Уэсли, 2007.
ISBN 0-321-48091-0.
[Версии] Версии стандарта Unicode
http://www.unicode.org/standard/versions/
Для получения информации о нумерации версий, цитировании и ссылках
стандарт Unicode, база данных символов Unicode и Unicode
Технические отчеты.
[W3CCharMod] Модель персонажа для
Всемирная паутина 1.0: основы

http://www.w3.org/TR/charmod

Спасибо доктору Джули Аллен за обширное редактирование текста и множество предложений по
как улучшить читаемость, в частности раздела 2.

Ниже приведены изменения по сравнению с предыдущими версиями этого
документ.

Версия 7 [KW]

  • Обновлен заголовок модели кодировки символов Unicode.
  • Обновлены все ссылки.
  • Раздел реорганизованных изменений в маркированные списки,
    сгруппированы по опубликованным версиям, чтобы соответствовать текущему стилю технического отчета.
  • Обновлено для Unicode 5.0 и 5.1.
  • Обновлены пронумерованные пункты 1 и 3 в Разделе 4, чтобы отразить
    обновленная модель относительно плохо сформированных последовательностей и концепции нехарактеров.
  • Удалено утверждение, что UTF-16 является CEF «по умолчанию» для Unicode 4.0.
  • Обновленная таблица форм кодирования, чтобы указать, что ISO / IEC 10646: 2009
    снизит уровни реализации и будет тесно согласован с Unicode 5.0.
  • Добавлено примечание о других последствиях для стабильности в Раздел 2.1.
  • В Разделе 2.3 «графема» заменена на «кластер графем».
  • Мелкие правки повсюду.

Версия 6 является предлагаемым обновлением, здесь отмечены только изменения между версиями 5 и 7.

Редакция 5 [AF]

  • Выровнял обсуждение TES для более точного соответствия
    обычная практика.
  • Улучшено обсуждение CES.
  • Отредактировал текст для стиля и ясности повсюду, помечен
    цифры, изменил некоторые списки на таблицы, применил копи-правки.
  • Улучшено обсуждение CES.
  • Обновлено для Unicode 4.0.
  • Добавлены подразделы по управлению версиями,
    Порядок байтов и строки.
  • Расширено обсуждение типов данных и привязки API.
  • Переход на текущий формат TR.

Редакции 3.3 и 4 являются предлагаемыми обновлениями, только изменения между
здесь отмечены версии 3.2 и 5.


Copyright © 1999-2008 Unicode, Inc. Все права защищены.
Консорциум Unicode не дает никаких явных или подразумеваемых гарантий любого рода, и
не несет ответственности за ошибки или упущения.Мы не несем ответственности за
случайные и косвенные убытки в связи с
использование информации или программ, содержащихся в данном техническом
отчет. Применяются Условия использования Unicode.

Unicode и логотип Unicode являются товарными знаками Unicode,
Inc., и зарегистрированы в некоторых юрисдикциях.

Декодировать или кодировать текст Unicode

Поделиться

http://www.online-toolz.com/tools/text-unicode-entities-convertor.php

Unicode — это отраслевой стандарт вычислительной техники для согласованного кодирования,
представление и обработка текста, выраженного в большей части письменности мира
системы. Разработан совместно со стандартом универсального набора символов
и опубликован в виде книги как стандарт Unicode, последняя версия
Unicode состоит из более чем 109 000 символов, охватывающих 93
скрипты, набор кодовых диаграмм для наглядного ознакомления, методология кодирования
и набор стандартных кодировок символов, перечисление символов
свойства, такие как верхний и нижний регистр, набор справочных данных компьютера
файлы и ряд связанных элементов, таких как свойства персонажей, правила для
нормализация, декомпозиция, сопоставление, рендеринг и двунаправленное отображение
порядок (для правильного отображения текста, содержащего оба скрипта с письмом справа налево,
такие как арабский и иврит, а также письма с написанием слева направо).По состоянию на 2011 г.
последняя основная версия Unicode — Unicode 6.0. Консорциум Unicode,
некоммерческая организация, которая координирует разработку Unicode, имеет
амбициозная цель в конечном итоге заменить существующие схемы кодирования символов
с Unicode и его стандартными схемами формата преобразования Unicode (UTF), как
многие из существующих схем ограничены по размеру и сфере применения и
несовместим с многоязычной средой. Успех Unicode в унификации
наборы символов привели к его широкому распространению и преимущественному использованию в
интернационализация и локализация компьютерного программного обеспечения.В стандарте есть
были реализованы во многих новейших технологиях, включая XML, Java
язык программирования, Microsoft .NET Framework и современные операционные
системы. Юникод может быть реализован с помощью различных кодировок символов. Большинство
обычно используются кодировки UTF-8 (который использует один байт для любого ASCII
символы, которые имеют одинаковые кодовые значения как в кодировке UTF-8, так и в кодировке ASCII,
и до четырех байтов для других символов), ныне устаревший UCS-2 (который использует
два байта для каждого символа, но не может кодировать каждый символ в текущем
Стандарт Unicode) и UTF-16 (который расширяет UCS-2 для обработки кодовых точек.
выходит за рамки UCS-2).

Источник: Википедия

AKA:

Ключевые слова: текст, HTML, сущности, преобразователь, кодировка, символы,
экранирование, декодирование, unescape, unicode, utf8, ascii

Основы Unicode — старое расположение руководства пользователя ICU

Введение в Unicode

Unicode — это стандарт,
точно определяет набор символов, а также небольшое количество
кодировки для него. Это позволяет вам обрабатывать текст на любом языке
эффективно. Это позволяет одному исполняемому файлу приложения работать на
глобальная аудитория.ICU, например Java ™, Microsoft® Windows NT ™, Windows ™ 2000
и другие современные системы, предоставляет решения для интернационализации на основе
в Юникоде.

Эта глава предназначена как введение в кодовые страницы в целом и Unicode в частности. Для получения дополнительной информации см .:

  1. Веб-сайт консорциума Unicode

  2. Что такое Юникод?

  3. IBM® Globalization

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

Традиционные наборы символов и Unicode

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

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

  2. Набор кодированных символов отображает символы из набора символов или репертуара в числовые значения.

  3. Схема кодирования символов определяет представление
    числовые значения из одного или нескольких наборов кодированных символов в битах и ​​байтах.

Для простых кодировок, таких как ASCII, последние два понятия
в основном то же самое: ASCII назначает 128 символов и управляющие коды для
последовательные цифры от 0 до 127. Эти символы и управляющие коды
кодируются как простые беззнаковые двоичные целые числа. Следовательно, ASCII — это
как кодированный набор символов, так и схема кодирования символов.

ASCII
кодирует только 128 символов, 33 из которых являются управляющими кодами, а не
графические, отображаемые символы. Он был разработан, чтобы представлять
Текст на английском языке для американской базы пользователей, поэтому
недостаточно для представления текста практически на любом языке, кроме
Американский английский. Фактически, большинство традиционных кодировок ограничивались
один или несколько языков и скриптов.

ASCII предлагается естественным путем
в целях расширения: разработан в 1960-х годах для работы в системах с 7-битными
байтов, в то время как большинство компьютеров и интернет-протоколов с 1970-х годов используют
8-битные байты, дополнительный бит позволял другим 128-байтовым значениям представлять
больше персонажей.Были разработаны различные кодировки, поддерживающие
разные языки. Некоторые из них были основаны на ASCII, другие — нет.

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

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

Как правило, минимальные требования для
совместимость обмена текстовыми данными заключается в том, что кодировка (набор символов
& схема кодирования) должны быть правильно указаны в документе и
в протоколе.Например, электронная почта / SMTP и HTML / HTTP предоставляют
означает указать «кодировку», как это называется в стандартах Интернета.
Однако очень часто кодировка не указывается, указывается
неправильно, или отправитель и получатель не согласны с его выполнением.

Схема кодирования ISO 2022 была создана для хранения текста во многих различных
языков. Это позволяет встраивать другие кодировки, предварительно объявив
их, а затем переключаться между ними. Полная поддержка всех функций и
возможные кодировки с ISO 2022 требуют сложной обработки и
необходимость поддержки множества кодировок.Для восточноазиатских языков подмножества
были разработаны, которые охватывают только один язык или несколько одновременно, но
они намного более управляемы. ISO 2022 не подходит для использования в
внутренняя обработка. Он предназначен для обмена данными.

Глифы и символы

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

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

Несмотря на разные визуальные варианты
определенной буквы, она все еще сохраняет свою идентичность.Например,
Арабская буква хе имеет четыре общих визуальных представления
использовать. Какой бы из них ни использовался, он по-прежнему сохраняет свою идентичность как буква
хех. Именно эту идентичность кодирует Unicode, а не визуальный
представление. Это также сокращает количество независимых
требуются символьные значения.

Обзор Unicode

Unicode
был разработан как однокодированный набор символов, который поддерживает
все языки мира. Первая версия Unicode использовала 16-битную
числа, которые позволили закодировать 65 536 знаков без
сложные многобайтовые схемы.С добавлением большего количества символов,
и следуя потребностям реализации многих различных платформ, Unicode
был расширен, чтобы разрешить более миллиона символов. Несколько других
схемы кодирования были добавлены. Это внесло больше сложности в
Стандарт Unicode, но гораздо меньше, чем управление большим количеством
разные кодировки.

Начиная с Unicode 2.0 (опубликованного в 1996 году), стандарт Unicode начал назначать числа от 0 до 10ffff 16 ,
который требует 21 бит, но не использует их полностью.Это дает
более чем достаточно места для всех письменных языков мира. В
оригинальный репертуар охватывал все основные языки, обычно используемые в
вычисление. Unicode продолжает расти, и он включает больше скриптов.

Дизайн Unicode несколько отличается от традиционных наборов символов и схем кодирования:

  1. Его репертуар позволяет пользователям эффективно включать текст почти на всех языках в один документ.

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

  3. Многие символы, например буквы с диакритическими знаками и умляуты, могут
    можно комбинировать из базового символа и модификаторов акцента или умлаута.
    Такое объединение уменьшает количество разных символов, которые необходимо
    кодироваться отдельно. «Предварительно составленные» варианты для персонажей, которые
    существовали в общих наборах символов в то время, были включены для
    совместимость.

  4. Персонажи и их использование четко определены и описаны. Пока
    традиционные наборы символов обычно содержат только имя или изображение
    символа, его номера и байтовой кодировки, Unicode имеет
    обширная база данных свойств, доступная для скачивания.Это также
    определяет ряд процессов и алгоритмов для работы со многими
    аспекты обработки текста, чтобы сделать его более совместимым.

Раннее включение всех символов обычно используемых
наборы символов делают Unicode полезной «точкой поворота» для преобразования
между традиционными наборами символов и позволяет обрабатывать
текст не в Юникоде, сначала преобразовав в Юникод, обработав текст,
и преобразовать его обратно в исходную кодировку без потери данных.

В
первые 128 значений кодовой точки Unicode присваиваются одним и тем же символам
как в US-ASCII.Например, один и тот же номер присваивается одному и тому же
персонаж. То же самое верно для первых 256 значений кодовой точки
Unicode по сравнению с ISO 8859-1 (Latin-1), который сам по себе является прямым
надмножество US-ASCII. Это позволяет легко адаптировать многие приложения к
Unicode, потому что числа для многих синтаксически важных символов
одинаковые.

Формы и схемы кодирования символов для Unicode

Unicode присваивает символам номер от 0 до 10FFFF 16 ,
давая достаточно места для однозначного кодирования каждого
характер в общем использовании.Такой символьный номер называется «кодом».
точка ».

Юникод
кодовые точки — это просто неотрицательные целые числа в определенном диапазоне.
У них нет неявного двоичного представления или ширины 21 или
32 бита. Для кодирования определены двоичное представление и ширина единицы измерения.
формы.

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

. Различные формы кодировки Unicode оптимизированы для множества различных целей:

  1. UTF-16, форма кодировки по умолчанию, отображает точку кода символа в одно или два 16-битных целых числа.

  2. UTF-8 — это байтовая кодировка, которая предлагает обратную
    совместимость с основанными на ASCII байтовыми API и протоколами. А
    символ хранится в 1, 2, 3 или 4 байтах.

  3. UTF-32 — это простейшая, но наиболее требовательная к памяти форма кодирования: в ней используется одно 32-битное целое число на каждый символ Unicode.

  4. SCSU — это схема кодирования, которая обеспечивает простое сжатие
    Текст в Юникоде. Он предназначен только для ввода и вывода, а не для
    внутреннее использование.

ICU внутренне использует UTF-16. ICU 2.0 полностью поддерживает дополнительные символы (с кодовыми точками 10000 16 ..10FFFF 16 . Старые версии ICU обеспечивали только частичную поддержку дополнительных символов.

Для
ввода / вывода, схемы кодирования символов определяют байтовую сериализацию
текст. UTF-8 сам по себе является формой кодирования и схемой кодирования.
потому что он основан на байтах. Для каждого из UTF-16 и UTF-32 есть два
определены варианты: тот, который сериализует единицы кода в байтах с прямым порядком байтов
порядок (сначала старший байт), и тот, который сериализует код
единицы в порядке байтов с прямым порядком байтов (сначала младший байт).В
соответствующие схемы кодирования называются UTF-16BE, UTF-16LE, UTF-32BE,
и UTF-32LE.

В
имена «UTF-16» и «UTF-32» неоднозначны. В зависимости от контекста они
относятся к формам кодировки символов, в которых используются 16/32-битные слова.
обрабатываются и, естественно, хранятся в порядке байтов платформы, или они
относятся к зарегистрированным IANA именам кодировок, т. е. к кодировке символов
схемы или байтовые сериализации. Помимо простого байта
сериализации, наборы символов с этими именами также используют необязательный байт
Знаки заказа (см. Serialized Formats
(§) ниже).

Обзор UTF-16

Форма кодировки по умолчанию для
В стандарте Unicode используются 16-битные кодовые единицы. Значения кодовых точек для большинства
общие символы находятся в диапазоне от 0 до FFFF 16 и кодируются только одной 16-битной единицей того же значения. Кодовые точки от 10000 16 до 10FFFF 16
кодируются двумя кодовыми единицами, которые часто называют «суррогатами», и
их называют «суррогатной парой», когда вместе они правильно
закодировать один символ Юникода.Первый суррогат в паре должен быть в
диапазон от D800 16 до DBFF 16 , а второй должен быть в диапазоне от DC00 16 до DFFF 16 .
Каждая кодовая точка Unicode имеет только одну возможную кодировку UTF-16 с
либо одна кодовая единица, которая не является суррогатом, либо с правильной парой
суррогаты. Значения кодовой точки от D800 16 до DFFF 16 зарезервированы только для этого механизма и никогда сами по себе не будут присвоены никаким символам.

Наиболее часто используемые символы имеют кодовые точки ниже FFFF 16 , но Unicode 3.1 назначает более 40 000 дополнительных символов, которые используют суррогатные пары в UTF-16.

Примечание
что лексическое сравнение строк UTF-16 на основе их 16-битного кода
единиц не приводит к тому же порядку, что и сравнение кодовых точек.
Обычно это не проблема, поскольку используются только редко используемые символы.
затронутый. Большинство процессов не полагаются на одни и те же результаты в таких
сравнения. При необходимости простая модификация строки
сравнение может быть выполнено, что по-прежнему позволяет эффективно использовать кодовые единицы на основе
сравнений и делает их совместимыми со сравнениями кодовых точек.ICU
для этого есть функции C и C ++ API.

Обзор UTF-8

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

UTF-8 поддерживает
прозрачность для всех значений кода ASCII (0..127). Эти ценности делают
не появляется ни в одном байте преобразованного результата, кроме как в прямом
представление значений ASCII. Таким образом, текст ASCII также является текстом UTF-8.

Характеристики UTF-8 включают:

  1. Кодовые точки Unicode от 0 до 7F 16
    кодируются одним байтом одного и того же значения. Следовательно, ASCII
    символы занимают на 50% меньше места в кодировке UTF-8, чем в UTF-16.

  2. Все остальные кодовые точки закодированы многобайтовыми последовательностями, с
    первый байт (ведущий байт), указывающий количество следующих за ним байтов
    (байты следа). Это приводит к очень эффективному синтаксическому анализу. Ведущие байты
    находятся в диапазоне от c0 16 до fd 16 , байты следа находятся в диапазоне от 80 16 до bf 16 .Значения байтов fe 16 и FF 16 никогда не используются.

  3. UTF-8 относительно компактен и экономичен в использовании
    байтов, необходимых для кодирования текста в европейских сценариях, но использует
    На 50% больше места, чем UTF-16, для текста из Восточной Азии. Кодовые точки до 7FF 16 занимают два байта, кодовые точки до FFFF 16 занимают три (на 50% больше памяти, чем UTF-16), а все остальные четыре.

  4. Двоичное сравнение строк UTF-8 на основе их байтов приводит к тому же порядку, что и сравнение значений кодовой точки.

Обзор UTF-32

В кодировке UTF-32 всегда используется одно 32-битное целое число для каждой кодовой точки Unicode. Это приводит к очень простой кодировке.

недостатком является потребление памяти: поскольку значения кодовой точки используют только 21
бит, одна треть памяти всегда не используется, а поскольку чаще всего
используемые символы имеют значения кодовой точки до FFFF 16 , они занимают только одну 16-битную единицу в UTF-16 (на 50% меньше) и до трех байтов в UTF-8 (на 25% меньше).

UTF-32
в основном используется в API, которые определены с тем же типом данных для
как кодовые точки, так и кодовые единицы. Современные версии стандарта C
библиотека, поддерживающая Unicode, использует 32-битный wchar_t с UTF-32
семантика.

Обзор SCSU

SCSU (Стандартный
Схема сжатия для Unicode) предназначена для уменьшения размера
Текст Unicode для ввода и вывода. Это простое сжатие, которое
преобразует текст в поток байтов. Обычно он использует один байт на
символ в маленьких шрифтах и ​​два байта на символ в больших, Восток
Азиатские шрифты.

Обычно он короче любого из UTF.
Однако SCSU сохраняет состояние, что делает его непригодным для внутреннего использования.
обработка. Он также использует все возможные байтовые значения, которые могут потребовать
дополнительная обработка для таких протоколов, как SMTP (электронная почта).

См. Также http://www.unicode.org/unicode/reports/tr6/
.

Другие кодировки Unicode

Другие кодировки Unicode разрабатывались с течением времени для различных целей. Большинство из них реализовано в ICU, см. Source / data / mappings / convrtrs.текст

  1. BOCU-1: двоичное сжатие Unicode
    An
    кодирование Unicode, которое примерно так же компактно, как SCSU, но имеет много
    меньшее количество гос. В отличие от SCSU, он сохраняет порядок кодовых точек и
    может использоваться в 8-битных письмах без кодировки передачи. BOCU-1 не , а не сохраняет символы ASCII в ASCII-читаемой форме. См. Техническое примечание Unicode №6.
    .

  2. UTF-7: предназначен для 7-битных писем; простой и не очень компактный.
    Поскольку почтовые системы были 8-битными безопасными в течение нескольких лет, UTF-7
    больше не нужно и не рекомендуется.Большинство символов ASCII
    читаемые, другие кодируются в формате base64. См. RFC 2152
    .

  3. IMAP-mailbox-name: вариант UTF-7, который подходит для выражения строк Unicode как символов ASCII для имен файлов Unix.
    Имя «IMAP-mailbox-name» специфично для ICU!
    См. RFC 2060 ПРОТОКОЛ ДОСТУПА К ИНТЕРНЕТ-СООБЩЕНИЯМ — ВЕРСИЯ 4rev1
    раздел 5.1.3. Международное соглашение об именах почтовых ящиков.

  4. UTF-EBCDIC: удобная для EBCDIC кодировка, аналогичная UTF-8.См. Технический отчет Unicode №16.
    . Начиная с ICU 2.6, UTF-EBCDIC не реализован в ICU.

  5. CESU-8: Совместимая схема кодирования для UTF-16: 8-битный
    An
    несовместимый вариант UTF-8, который сохраняет 16-битный Unicode (UTF-16)
    порядок строк вместо порядка кодовых точек. Не для открытого обмена. Видеть
    Технический отчет Unicode № 26
    .

Программирование с использованием UTF

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

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

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

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

  3. Не имеет перекрытий. Если пользователи ICU ищут строку A в
    строка B, вы никогда не получите ложного совпадения по кодовым точкам. Пользователям не нужны
    для преобразования в кодовые точки для поиска по строкам. Ложных совпадений никогда
    происходит, поскольку конец одной последовательности никогда не совпадает с началом
    другая последовательность. Перекрытие — одна из самых больших проблем с общими
    многобайтовые кодировки типа Shift-JIS.Все UTF этого избегают
    проблема.

  4. Использует простую итерацию. Получение следующей или предыдущей кодовой точки
    прост и требует небольшого количества машин
    инструкции.

  5. Может использовать кодировку UTF-16, которая фактически полностью симметрична. ICU
    пользователи могут определить по любой единичной кодовой единице, является ли она первой,
    последний или только один для кодовой точки. Перемещение (итерация) в любом
    направление через текст UTF-16 одинаково быстро и эффективно.

  6. Использует медленную индексацию по кодовым точкам.Эта процедура индексации
    недостаток всех кодировок переменной ширины. За исключением UTF-32, это
    неэффективно находить границы кодовой единицы, соответствующие n-му коду
    point или найти смещение кодовой точки, содержащее n-ю кодовую единицу.
    Оба включают сканирование с начала текста или с последнего известного
    граница. ICU, как и большинство распространенных API, всегда индексирует по единицам кода. Это
    подсчитывает кодовые единицы, а не кодовые точки.

Преобразование между различными UTF выполняется очень быстро. В отличие от
преобразование в устаревшие кодировки, такие как Latin-2, преобразование
между UTF не требует просмотра таблицы.

ICU обеспечивает два
определения основных типов данных для Unicode. UChar32 — это 32-битный тип для
кодовые точки и используются для одиночных символов Юникода. Это может быть подписано
или без знака. Это то же самое, что и wchar_t, если его ширина составляет 32 бита. UChar — это
16-разрядное целое число без знака для кодовых единиц UTF-16. Это базовый тип
для строк (UChar *), и это то же самое, что и wchar_t, если это 16 бит
широкий.

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

Сериализованные форматы

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

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

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

Символ ZERO WIDTH NO-BREAK SPACE (FEFF 16 )
может использоваться как подпись, добавляя ее к файлу или потоку. В
альтернативная функция U + FEFF в качестве символа управления форматом была
скопировано в U + 2060 WORD JOINER, а U + FEFF следует использовать только для
Подписи Unicode.

Различные схемы кодирования символов генерируют разные, разные последовательности байтов для U + FEFF:

  1. UTF-8: EF BB BF

  2. UTF-16BE: FE FF

  3. UTF-16LE: FF FE

  4. UTF-32BE: 00 00 FE FF

  5. UTF-32LE: FF FE 00 00

  6. SCSU: 0E FE FF

  7. BOCU-1: FB EE 28

  8. UTF-7 : 2B 2F 76 (38 | 39 | 2B | 2F)

  9. UTF-EBCDIC: DD 73 66 73

ICU предоставляет функцию ucnv_detectUnicodeSignature () для обнаружения подписи Unicode.

Есть
нет подписи для CESU-8, отдельной от подписи для UTF-8. UTF-8 и
CESU-8 кодирует U + FEFF и фактически все кодовые точки BMP с одинаковым
байты. Возможность ошибочной идентификации одного как другого — одна
причин, по которым CESU-8 следует использовать только в ограниченных, закрытых,
определенные среды.

В UTF-16 и UTF-32, где подпись также различает
порядок байтов с прямым и обратным порядком байтов, он также называется байтовым
знак заказа (BOM).Подпись работает для UTF-16, так как кодовая точка
который имеет кодировку с заменой байтов, FFFE 16 , никогда не будет
допустимый символ Юникода. (Это «несимвольный» код.) В
Интернет-протоколы, если спецификация кодировки «UTF-16» или
Используется «UTF-32», предполагается наличие байта подписи
последовательность (BOM), которая определяет порядок байтов, что не так
для имен схемы / кодировки кодирования с «BE» или «LE».

Если
текст указывается для кодировки в кодировке UTF-16 или UTF-32 и
не начинается с спецификации, тогда его следует интерпретировать как UTF-16BE или
UTF-32BE соответственно.

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

Если подпись была обнаружена, то «символ» подписи U + FEFF должен быть удален из потока Unicode после
конверсия. Удаление байтов подписи перед преобразованием может вызвать
преобразование не выполняется для кодировок с отслеживанием состояния, таких как BOCU-1 и UTF-7.

Распознавать подпись или нет, зависит от протокола или приложения.

  1. Если
    протокол указывает имя набора символов, тогда поток байтов должен быть
    интерпретируется в соответствии с определением этого имени. Только «UTF-16»
    и имена «UTF-32» включают распознавание меток порядка байтов, которые
    специфичны для них (и преобразователи ICU для этих имен делают это
    автоматически). Ни одна из других кодировок Unicode не определена для
    включать любую обработку подписи / спецификации.

  2. Если имя кодировки не указано, например, для текстовых файлов в
    большинство файловых систем, то приложения обычно должны полагаться на эвристику, чтобы
    определить кодировку файла.Многие форматы документов содержат встроенные
    или неявное объявление кодировки, но для текстовых файлов это
    разумно использовать подписи Unicode в качестве простой и надежной эвристики.
    Это особенно часто встречается в системах Windows. Однако некоторые инструменты для
    обработка обычного текстового файла (например, многие инструменты командной строки Unix) не
    подготовлен для подписей Unicode.

Стандарт Unicode является отраслевым стандартом

Стандарт Unicode является отраслевым стандартом и аналогичен ISO 10646-1.Примерно в 1993 году эти два стандарта были объединены в один и тот же
стандартный набор символов. Оба стандарта имеют одинаковый характер
репертуар и одинаковые формы и схемы кодирования.

Одно отличие заключалось в том, что стандарт ISO определял значения кодовой точки от 0 до 7FFFFFFF 16 , а не только до 10FFFF 16 .
Рабочая группа ISO решила добавить поправку к стандарту. В
поправка устраняет эту разницу, объявляя, что никакие символы не будут
когда-либо были назначены кодовые точки выше 10FFFF 16 .Главная причина
для рабочей группы ISO решение — это совместимость между UTF.
UTF-16 не может кодировать какие-либо кодовые точки выше этого предела.

Это означает, что пространство кодовых точек для Unicode и ISO 10646 теперь одинаково! Эти
изменения в ISO 10646 были внесены недавно и должны быть внесены в
издание ISO 10646: 2003, которое также объединяет все части
стандарт в один.

Прежнее, большее пространство кода — это
причина, по которой определение ISO для UTF-8 определяет последовательности из пяти и
шесть байтов, чтобы покрыть весь этот диапазон.

Еще одно отличие состоит в том, что
стандарт ISO определяет формы кодирования «UCS-4» и «UCS-2». UCS-4 — это
по существу UTF-32 с теоретическим верхним пределом 7FFFFFFF 16 ,
используя 31 из 32 бит. Однако на практике комитет ISO
принял, что символы выше 10FFFF не будут кодироваться, поэтому
по существу нет разницы между формами. Стенды «4»
для «четырехбайтовой формы».

UCS-2 — это подмножество UTF-16, которое ограничено
в кодовые точки от 0 до FFFF, исключая суррогатные кодовые точки.Таким образом, он не может представлять символы с кодовыми точками выше FFFF.
(называемые дополнительными символами).

Нет необходимости в преобразовании между UCS-2 и UTF-16. Разница только в трактовке суррогатов.

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

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

кодировок символов — боль, которая не исчезнет, ​​часть 1/3: не-Unicode | Рэнди Ау

Итак, если существует конечное количество кодовых страниц и языки разные, должен быть способ для алгоритма выяснить, какая кодировка используется, верно?

Соооорта. Но не совсем так.

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

Группа ICU (Международные компоненты для Unicode) предоставляет набор библиотек Java и C для работы с интернационализацией. Один из предоставленных компонентов — детектор кодировки.

Mozilla также создала «универсальный детектор кодировки», предназначенный для обнаружения кодировок, используемых в их браузерах. Приведенный выше документ по ссылке представляет интерес для чтения, потому что он использует статистический анализ и свойства определенных наборов символов, чтобы выяснить вероятность того, что данный фрагмент текста является определенной кодировкой.Это включает использование статистического анализа текста распределения китайских / японских / корейских иероглифов, чтобы помочь определить, какая кодировка используется.

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

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

Некоторые примеры с использованием Python 3

Python 3 хранит строки внутри как Unicode — у них есть отдельный тип byte (), который может хранить фактические двоично-закодированные экземпляры строк. Итак, в приведенных ниже примерах я могу принудительно преобразовать заданную строку в различные кодировки и пропустить ее через встроенный детектор набора символов. Давай посмотрим что происходит.

 # Пример использования Python 3, чистый ASCIIIn: import chardet # библиотека обнаружения символов 
In: s = 'A sample фраза' # использует только символы ASCIIIn: chardet.detect (s.encode ('cp1252'))
Out: {'кодировка': ' ascii ', 'уверенность': 1.0, 'язык': ''} In: chardet.detect (s.encode ('cp932 '))
Out: {' encoding ':' ascii ',' уверенность ': 1.0,' language ':' '} # Самые старые кодировки отображаются как ASCII, потому что их нижние 128 значений являются ASCII и отличаются только> 128 In: chardet.detect (s.encode ('utf8'))
Out: {'encoding': ' ascii ', 'уверенность': 1.0, 'language': ''}
# UTF-8 обратно совместим с ASCII и в этой ситуации выглядит как ASCIIIn: chardet.detect (s.encode ('utf16'))
Out: {'кодировка': 'UTF-16', 'уверенность': 1.0, 'язык': ''}
# UTF-16 использует 2 байта на символ, поэтому он определенно несовместим с ASCII

Обратите внимание, как, поскольку предложение было написано в чистом ASCII, детектор (правильно) вызывает строку ASCII. В нем не было обнаружено никаких символов, отличных от ASCII, чтобы говорить об обратном. Но моя истинная схема кодирования может быть cp1252 (Windows Latin-1), cp932 (Windows shift-jis) или даже UTF-8 (спроектирована для обратной совместимости с ASCII). Фактически, работая наивно, детектор даст правильный ответ для строки, но это может быть неправильный ответ для всего вашего текста.

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

Давайте посмотрим на строку, отличную от ASCII.

 In: u = u 'サ ン プ ル で す (笑) = D' # актуальный японский текст с некоторыми ASCII 
In: u.encode (' cp932 ')
Out: b '\ x83T \ x83 \ x93 \ x83v \ x83 \ x8b \ x82 \ xc5 \ x82 \ xb7 \ x81i \ x8f \ xce \ x81j = D'In: u.encode ('utf8'). hex ()
Out: 'e382b5e383b3e38397e383abe381a7e38199efbc88e9.detect (u.encode (' utf-8 '))
Out: {'encoding': ' utf-8 ', 'уверенность': 0,99, 'language': ''} In: u.encode ( 'utf16'). hex ()
Out: 'fffeb530f330d730eb3067305ff117b09ff20003d004400'
# Обратите внимание, как UTF-16 короче, чем UTF-8 для хранения CJK textIn: u.encode (' utf7 ') 900XBZM wh7Ef8J = D '
In: chardet.detect (u.encode (' utf-7 '))
Out: {' кодировка ':' ascii ',' уверенность ': 1.0,' язык ': ''}
# UTF-7 не является частью официального стандарта юникода! Иногда он используется для отправки текста в кодировке Unicode по электронной почтеIn: u.encode (' iso2022_jp ')
Out: b '\ x1b $ B% 5% s% W% k $ G $ 9! J> P! K \ x1b (B = D '
In: chardet.detect ( u.encode (' iso2022_jp '))
Out: {'кодировка': ' ISO-2022-JP ', 'уверенность': 0,99, 'язык': 'Японский'}
# ISO2022 - это стандарт, определяет схемы многобайтового кодирования, поэтому существуют версии для многих языков Восточной Азии In: chardet.detect (u.encode (' shift-jis '))
Out: {'encoding': ' SHIFT_JIS ', 'уверенность' : 0.99, 'language': 'Japanese'}
In: chardet.detect (u.encode (' cp932 '))
Out: {'encoding': ' SHIFT_JIS ', 'уверенность': 0.99, 'язык ':' Japanese '}
# Shift-JIS и cp932 имеют сложную взаимосвязь: они по сути одинаковы, но имеют несколько разных символов.

Все становится еще интереснее, когда мы имеем дело с текстом, отличным от ASCII. Обратите внимание, что кодировка UTF-7 определяется как ASCII! Это связано с тем, что он был разработан для отправки через 7-битные системы только с ASCII (например, почтовые серверы, благодаря тому, что RFC 2822 является базовым RFC электронной почты, и он также предполагает только 7-битный текст).

Также обратите внимание, что он определяет текст из cp932 как Shift-JIS. На протяжении многих лет многие производители и органы стандартизации выпускали множество разновидностей Shift-JIS с разными уровнями обратной совместимости. Для этой конкретной струны она совместима с обеими, и детектор выбрал одну. Стандарты не соответствуют определенным персонажам, и детектор не узнает об этом, пока не встретит их.

Обратите внимание, что каждый раз библиотека была очень уверена (0,99 или 1) в своей правильности.Поскольку им были предоставлены крошечные фрагменты без какого-либо контекста, у них нет причин думать иначе. Не поддавайтесь ложному чувству безопасности.

Кодировка

символов — Поддержка RStudio

Начиная с версии 0.93, RStudio поддерживает символы, отличные от ASCII, для ввода и вывода.

Консоль

символа Unicode можно использовать как для ввода, так и для вывода в консоли.

Редактор исходного кода

Редактор исходного кода RStudio изначально поддерживает символы Unicode.Это позволит вам вводить или вставлять символы с любого языка, даже те, которые не являются частью набора символов документа. RStudio позволит вам сохранить такие документы, но выведет на консоль R предупреждение о том, что не все символы могут быть закодированы. Если вы закроете документ без повторного сохранения в более подходящей кодировке, эти символы будут потеряны.

Если сомневаетесь в том, какую кодировку использовать, используйте UTF-8, так как он может кодировать любой символ Unicode.

Чтение и запись файлов

Редактор исходного кода RStudio может читать и записывать файлы с использованием любой кодировки символов, доступной в вашей системе:

  • Вы можете выбрать кодировку для чтения с помощью File: Reopen with Encoding , которая перечитает текущий файл с диска с новой кодировкой.
  • Вы также можете сохранить открытый файл, используя другую кодировку с помощью Файл: Сохранить с кодировкой .

Команды Reopen и Save with Encoding отображают следующий диалог:

Установка кодировки по умолчанию

Если вы часто используете набор символов, отметьте «Установить как кодировку по умолчанию для исходных файлов». Вы можете просмотреть или изменить это значение по умолчанию в диалоговом окне Инструменты: Параметры (для Windows и Linux) или Preferences (для Mac) в разделе Общие .

Если вы не установите кодировку по умолчанию, файлы будут открываться с использованием UTF-8 (на рабочем столе Mac, на рабочем столе Linux и на сервере) или кодировке системы по умолчанию (в Windows). При сохранении ранее несохраненного файла RStudio попросит вас выбрать кодировку, если присутствуют символы, отличные от ASCII.

Известные проблемы

  • Если вы позвоните Sys.

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

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