Отображение символов Юникода - PullRequest
0 голосов
/ 16 июня 2010

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

Я прочитал этот очень интересный вопрос.полезная статья на эту тему: http://www.joelonsoftware.com/articles/Unicode.html,, но мне стало интересно, как можно было бы идентифицировать отдельные глифы с учетом буфера данных Unicode.

Мои вопросы:

Как мне выполнить синтаксический анализ строки Unicode, скажем, UTF-8?

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

То есть, если я правильно интерпретировал метод хранения.

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

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

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

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Как мне разобрать строку Unicode, скажем, UTF-8?

Я предполагаю, что под "синтаксическим анализом" вы подразумеваете преобразование в кодовые точки.

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

Если вам нужно преобразовать в кодовые точки (UTF-32), тогда:

  1. Проверьте первый байт, чтобы увидеть, сколько байтов в символе.
  2. Посмотрите на завершающие байты персонажа, чтобы убедиться, что они находятся в диапазоне 80-BF. Если нет, сообщите об ошибке.
  3. Использование битовой маскировки и сдвига для преобразования байтов в кодовую точку.
  4. Сообщить об ошибке, если полученная вами последовательность байтов длиннее минимума, необходимого для представления символа.
  5. Увеличить указатель на длину последовательности и повторить для следующего символа.

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

Это не так. Изначально Unicode предназначался для фиксированной 16-битной кодировки. Позже было решено, что 65 536 символов было недостаточно, поэтому был создан UTF-16, а Unicode был переопределен для использования кодовых точек от 0 до 1 114 111.

Если вы хотите кодирование с фиксированной шириной, вам нужно 21 бит. Но это не так много языков с 21-битным целочисленным типом, поэтому на практике вам нужно 32 бита.

0 голосов
/ 16 июня 2010

Ну, я думаю, что это отвечает на это:

http://en.wikipedia.org/wiki/UTF-8

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

...