Ну вот и наконец-то началось конструктивное обсуждение
Вот, смотрите, какой вариант ещё есть:
Посредством новой SysFn говорим ядру "моё приложение хочет работать с юникодом".
И после этого все функции работают в режиме юникода.
Надо будет только добавить в APPDATA новое поле encoding.
Тогда функции вместо проверки префикса будут просто проверять APPDATA.encoding.
Можно в зависимости от значения APPDATA.encoding добавить возможность работы с разными кодировками, например ASCII|UTF8|UTF16|UTF32.
Есть нюанс с DrawText. Там есть флаг кодировки. Но и сейчас там проблема. Кодировки префикса и флага могут отличаться.
Насчёт AppPath вариант такой:
В заголовке программы вместоCode:
version dd 1
можно сделать
Code:
version dw 1
encoding db ?
reserved db ?
Это будет обратно совместимо, если принять, что для
ASCII значение
encoding = 0.
Так что, больше не надо никаких префиксов
Предлагаю добавить 2
SysFn:
SetEncoding и
GetEncoding. Пусть
SetEncoding возвращает старую кодировку. То есть можно было бы писать
Code:
LastEncoding = SetEncoding(ENC_UTF16);
/* do somthing */
SetEncoding(LastEncoding);
Не знаю, нужно ли поддерживать сразу и
BigEndian и
LittleEndian? Просто пока предлагаю такие константы
Code:
ASCII = 0
UTF16 = 1 ; SysFn70 уже использует 1 = UTF-16LE
UTF8 = 2
UTF32 = 3
Преимущества этого подхода:
не нужно новых заголовков
не нужно дублирования функций
не нужно префиксов
возможность установки encoding с помощью одной SysFn сразу для всех функций