Win32.Utf8
Aug 12, 2007 · CommentsWin32.Utf8
Я тут совсем недавно удивлялся почему нет библиотек, эмулирующих поддержку UTF-8 на уровне Win32 API. Т.е. такая библиотека реализует, скажем, CreateFileUtf8 в дополнение к предлагаемым системой CreateFileA и CreateFileW, а макрос CreateFile будет выбирать нужную реализацию уже из трех вариантов. Надо сказать, что по итогам обсуждения моё недоумение нисколько не уменьшилось. Даже ссылки на Michael Caplan - авторитета в этой области не помогли. Это, впрочем, как раз очень понятно. Набивать свои шишки куда как интереснее, чем послушать что говорят умные люди уже ходившие по этим граблям. :-)
В общем я решил попробовать набить своих шишек, - попробую написать эту библиотеку и добавить с её помощью поддержку Unicode в Notepad2 (вернее адаптированную под себя версию Notepad2). Пока что, всё выглядит довольно невинно - верный знак, что на самом деле всё гораздо сложнее. Нужно сделать следующее:
-
Написать или взять готовый парсер С – для разбора заголовочных файлов и извлечения из них объявлений функций и типов;
-
Научиться обрабатывать SAL аннотации параметров функций и членов структур;
-
Продумать сценарии прямого (UTF-8 -> UTF-16) и обратного (UTF-16 -> UTF-8) конвертирования текстовых параметров, включая нетривиальные случаи вроде «текстового буфера определённого размера, вложенного в структуру на которую указывает указатель» и т.п.;
-
Создать инфраструктуру, которая будет использоваться для конвертирования текстовых параметров;
-
Написать генератор оберток, который будет пользоваться этой инфраструктурой;
-
Предусмотреть всяческие исключения для всяких неординарных случаев и возможность написания оберток вручную.
Учитывая, что тратить на это я могу от силы часов 8 в неделю – затея затянется надолго. Опять же цель этого мероприятия не столько получить конечный результат, сколько получить «бесценный» опыт. Так что торопиться не будем. Кроме того, это означает, что вариант написать всё обертки вручную так же не рассматривается. (Хотя, вполне возможно, это было бы проще всего).
В качестве языков разработки я выбрал Python и C (или C-подобный C++). На Python легко пишется всякая скриптовая логика. На C будет генерироваться код обёрток. Да и парсить C проще в разы.
О ходе работ и своих находках буду делиться в блоге. Если из проекта выйдет хоть какой толк, то исходный код будет выложен в публичный Subversion репозиторий. Критика и идеи приветствуются. :-)