Понимание схем кодирования - PullRequest
0 голосов
/ 22 ноября 2018

Я не могу понять некоторые ключевые элементы кодирования:

  1. Является ли ASCII только символом или у него также есть алгоритм схемы кодирования?
  2. Имеются ли другие кодовые страницы Windows, такие как Latin1,их собственный алгоритм кодирования?
  3. Являются ли UTF7, 8, 16, 32 единственными алгоритмами кодирования?
  4. Используются ли алгоритмы UTF только с установленным UNICODE?

Учитывая текст ASCII: Hello World, если я хочу преобразовать его в Latin1 или BIG5, какие алгоритмы кодирования используются в этом процессе?В частности, Latin1 / Big5 использует свой собственный алгоритм кодирования или я должен использовать алгоритм UTF?

Ответы [ 4 ]

0 голосов
/ 16 мая 2019

Каждому символу в мире было присвоено значение Юникода [пронумеровано от 0 до ...].Это на самом деле уникальная ценность.Теперь, от человека зависит, как он хочет использовать это значение в Юникоде.Он может даже использовать его напрямую или может использовать некоторые известные схемы кодирования, такие как utf8, utf16 и т. Д. Схемы кодирования отображают это значение Юникода в некоторую конкретную битовую последовательность [может варьироваться от 1 байта до 4 байтов или может быть 8 в будущем , если мыпознакомиться со всеми языками юниверсов / инопланетян / мультивселенных ], чтобы их можно было однозначно идентифицировать в схеме кодирования.

Например, ASCII - это схема кодирования, которая кодирует только 128 символов из всех символов.Он использует один байт для каждого символа, что эквивалентно представлению utf8.GSM7 - это еще один формат, который использует 7 бит на символ для кодирования 128 символов из списка символов Unicode.

Utf8: он использует 1 байт для символов, значение Unicode которых равно до 127. Помимо этого, он имеет свой собственный способ представлениязначения Юникода.Использует 2 байта для кириллицы, затем 3 байта для символов хинди.

Utf16: он использует 2 байта для символов, у которых значение unicode равно до 127., а также 2 байта для символов кириллицы и хинди.

Все схемы кодирования utf фиксируют начальные биты в определенном шаблоне [например: 110 | restbits], а остальные биты [например: initialbits | 11001] принимают значение Юникода для создания уникального представления.

Википедия на utf8, utf16Юникод прояснит.Я кодировал переводчик utf, который преобразовывает входящий текст utf8 на всех языках в его эквивалентный текст utf16.

0 голосов
/ 22 ноября 2018

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

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

Теперь к вашим вопросам:

  1. ASCII - это и то и другое, он определяет 128 символов (некоторые из них являются управляющими кодами) и то, как они отображаются в значения байтов от 0 до 127.
  2. Каждое кодирование может определять свой собственный наборсимволов и как они отображаются в байтах
  3. нет, есть и другие ASCII, ISO-8859-1, ...
  4. Unicode использует двухэтапное отображение: сначала символыотображаются на (относительно) маленькие целые числа, называемые «кодовыми точками», затем эти целые числа отображаются на последовательность байтов.Первая часть одинакова для всех кодировок UTF, второй шаг отличается.Уникод имеет амбиции содержать все символы.Это означает, что большинство символов находятся в «наборе UNICODE».
0 голосов
/ 02 декабря 2018

1: Ascii - это просто кодировка - действительно простая кодировка.Это буквально просто положительный конец байта со знаком (0 ... 127), сопоставленного с символами и управляющими кодами.

См. https://www.ascii.codes/, чтобы просмотреть полный набор и проверить символы.

Определенно существуют алгоритмы кодирования для преобразования строк ascii в и из строк в других кодировках, но для записи или чтения строк ascii не требуется алгоритм сжатия / распаковки, как для utf8 или utf16, если выподразумевается.

2: LATIN-1 также не является сжатой (обычно называемой 'переменной шириной') кодировкой, поэтому для входа и выхода из нее не требуется никакого алгоритма.

См. https://kb.iu.edu/d/aepu для хорошего описания LATIN-1 концептуально и каждого персонажа в наборе.Как и многие кодировки, его первые 128 слотов просто ascii.Как и ascii, его размер составляет 1 байт, но это без знака байт, поэтому после последнего символа ascii (DEL / 127) LATIN1 добавляет еще 128 символов.

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

3: Опять же, кодировки Unicode - это просто кодировки.Но они все сжаты, кроме utf32.Поэтому, если вы не работаете с utf32, всегда есть шаг сжатия / распаковки, необходимый для их записи и чтения.

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

4: Да.Алгоритмы сжатия / распаковки для сжатых кодировок Unicode как раз для этих кодировок.Они не будут работать для любой другой кодировки.

Думайте об этом как zip / unzip.Разархивировать что-либо, кроме файла или папки, в архиве, конечно, не получится.Это относится к вещам, которые не сжаты в первую очередь, а также к вещам, которые сжаты , но используют другой алгоритм сжатия (например, rar).

Я недавно написал сжатие utf8 и utf16 /декомпрессионный код для новой разрабатываемой кроссплатформенной библиотеки, и я могу с уверенностью сказать вам, если вы введете строку в кодировке Big5 в мой метод, написанный специально для распаковки utf8 ... не только она не будет работать, но и может привести к краху.

Re: ваш вопрос "Hello World" ... Обратитесь к моему ответу на ваш второй вопрос о LATIN-1.Для перехода из ascii в LATIN-1 преобразование не требуется, поскольку первые 128 символов (0 ... 127) в LATIN-1 равны ascii.Если вы конвертируете из LATIN-1 в ascii, то же самое верно для нижней половины LATIN-1, но если в строке есть какой-либо из символов, превышающих 127, это будет то, что называется «потерянным» / частичным преобразованиемили прямой отказ, в зависимости от вашего уровня терпимости к потерям.В вашем примере, однако, все символы в «Hello World» имеют одинаковые значения в обеих кодировках, так что они будут безошибочно преобразовываться в любом направлении.

Я практически ничего не знаю о Big5,но независимо от этого, не используйте utf-x algos для других кодировок.Каждый из них написан специально для 1 конкретной кодировки (или в случае преобразования: пара кодировок).

Если вам интересны алгоритмы сжатия / распаковки utf8 / 16веб-сайт Unicode - это то место, с которого вы должны начать (однако, будьте осторожны. Они не используют метафору сжатия / распаковки в своей документации) :

http://unicode.org

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

... за исключением, может быть, достойного инструмента поиска кодовой точки: https://www.unicode.codes/

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

http://site.icu -project.org / home

Надеюсь, это поможет.

0 голосов
/ 22 ноября 2018

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

Одним из нововведений Unicode, в частности, является косвенное обращениев первую очередь присваивая каждому символу уникальный номер и беспокоясь о том, как вторично закодировать это число в байты.Есть несколько схем кодирования, как это сделать, от кодировок UCS и GB 18030 до наиболее часто используемых кодировок UTF-8 / UTF-16.Некоторые в значительной степени больше не функционируют, например, UCS-2.У каждого есть свои плюсы и минусы с точки зрения космического компромисса, простоты обработки и транспортабельности (например, UTF-7 для безопасной транспортировки по 7-битной системе, такой как электронная почта). Если не указано иное , все они могут кодировать полный набор текущих символов Юникода.

Для преобразования из одной кодировки в другую вам в значительной степени необходимо отобразить байты из одной таблицы в другую.Это означает, что если вы посмотрите на таблицу EBCDIC и таблицу Windows 1250 , то символы 0xC1 и 0x41 соответственно оба, кажется, представляют один и тот же символ "A", поэтому, когдаконвертируя между двумя кодировками, вы отобразите эти байты как эквивалентные.Да, это означает, что между каждой возможной парой кодирования должно быть одно такое отображение.

Поскольку это, очевидно, довольно трудоемкий процесс, современные преобразователи практически всегда проходят через Юникод в качестве посредника.Таким образом, каждая кодировка должна быть отображена только в таблицу Unicode, и преобразование может быть выполнено с помощью кодировка A → кодовая точка Unicode → кодировка B .В конце вы просто хотите определить, какие символы выглядят одинаково / имеют одинаковое значение, и соответствующим образом изменить представление байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...