Где я могу начать с программирования на C, ориентированного на Юникод?
-
19-09-2019 - |
Вопрос
Итак, я работаю над проектом на языке plain-C (ANSI 9899: 1999) и пытаюсь понять, с чего начать.:Юникод, UTF-8 и весь этот джаз.
В частности, это проект языкового интерпретатора, и у меня есть два основных места, где мне нужно будет обрабатывать Unicode:чтение в исходных файлах (язык якобы поддерживает идентификаторы Unicode и тому подобное), а также в ‘строковых’ объектах.
Я знаком со всеми очевидными основами Unicode, UTF-7/8/16/32 и UCS-2/4, так далее и тому подобное… В основном я ищу полезные, специфичные для C (то есть, пожалуйста, никаких C ++ или C #, это все, что было задокументировано здесь на SO ранее) ресурсы относительно моих ‘следующих шагов’ по внедрению материалов, дружественных к Unicode… в C.
Любые ссылки, справочные страницы, статьи Википедии, примеры кода - все это крайне приветствуется.Я также постараюсь сохранить список таких ресурсов здесь, в исходном вопросе, для всех, кто столкнется с этим позже.
- A должен прочитать прежде чем рассматривать что-либо еще, если вы не знакомы с Unicode и что такое кодировка на самом деле так и есть: http://www.joelonsoftware.com/articles/Unicode.html
- Домашняя страница в формате UTF-8: http://www.utf-8.com/
man 3 iconv
(а такжеiconv_open
иiconvctl
)- Международные компоненты для Unicode (через Джефф Риди)
libbasekit
, который, по-видимому, включает в себя легкие инструменты для обработки Юникода- Бойкий имеет некоторые функции Unicode
- Основной Детектор UTF-8 функция, посредством Кристоф
Решение
Международные компоненты для Unicode предоставляет переносимую библиотеку C для обработки Unicode.Вот их презентация для ICU4C:
Языки C и C++, а также многие среды операционных систем не обеспечивают полную поддержку Unicode и служб обработки текста, соответствующих стандартам.Несмотря на то, что некоторые платформы предоставляют хорошие услуги по обработке текста в формате Unicode, код переносимого приложения не может их использовать.Библиотеки ICU4C заполняют этот пробел.ICU4C предоставляет открытую, гибкую и портативную основу для приложений, которые можно использовать для удовлетворения требований глобализации программного обеспечения.ICU4C внимательно отслеживает отраслевые стандарты, включая Unicode и CLDR (общее хранилище данных локали).
Другие советы
GLib есть некоторые Функции Юникод и это довольно легкая библиотека.Это не тот уровень функциональности, который обеспечивает ICU, но для некоторых приложений этого может быть достаточно.Другие возможности GLib полезны и для портативных программ на языке C.
GTK+ построен на основе GLib.GLib предоставляет фундаментальные конструкции алгоритмического языка, которые обычно дублируются в приложениях.Эта библиотека имеет такие функции (этот список не является полным):
- Система объектов и типов
- Основной цикл
- Динамическая загрузка модулей (т.е.плагины)
- Поддержка потоков
- Поддержка таймера
- Распределитель памяти
- Потоковые очереди (синхронные и асинхронные)
- Списки (односвязные, двусвязные, двусторонние)
- Хэш-таблицы
- Массивы
- Деревья (N-арные и двоично сбалансированные)
- Строковые утилиты и обработка кодировок
- Лексический сканер и парсер XML
- Base64 (кодирование и декодирование)
Я думаю, что один из интересных вопросов заключается в следующем: каким должен быть ваш канонический внутренний формат для строк?Двумя очевидными вариантами (по крайней мере, для меня) являются
a) utf8 в ванильных c-строках b) utf16 в коротких массивах без знака
В предыдущих проектах я всегда выбирал utf-8.Почему ;потому что это путь наименьшего сопротивления в мире C.Все, с чем вы взаимодействуете (stdio, string.h и т.д.), будет работать нормально.
Далее следует - какой формат файла.Проблема здесь в том, что он виден вашим пользователям (если только вы не предоставляете единственный редактор для вашего языка).Здесь, я думаю, вы должны взять то, что они вам дают, и попытаться угадать, заглянув (помогают метки порядка байтов)