При использовании Game Maker 8.1...
...Max WinAPI 2 отображает вместо символов национальных алфавитов непонятно что?
...39DLL или другая сетевая библиотека отсылает строки, написанные не латиницей, в буферах, размер которых как минимум вдвое превышает символьную длину самой строки?
...невозможно работать с возвращаемыми из функций расширений строками, написанными национальным алфавитом?
Да, всё это довольно-таки распространённые проблемы при использовании старых расширений и GM 8.1.
А корень зла таков. Как известно, с версии 8.1 Game Maker стал использовать для хранения строк и работы с ними кодировку UTF-8, тогда как прошлые версии GM, под которые и создавались несовместимые ныне с национальными алфавитами расширения, использовали стандартную однобайтовую системную кодировку (например, для России это ANSI-1251). В итоге при попытке создания, например, русского интерфейса в том же Max WinAPI 2 получается вот это:

Codepage Converter - Обеспечение совместимости старых расширений с GM 8.1
В оригинале же этот интерфейс выглядит так:

Codepage Converter - Обеспечение совместимости старых расширений с GM 8.1
Однако теперь это больше не проблема.
Считаете иначе? Что ж, тогда знакомьтесь:
-= CODEPAGE CONVERTER =-
Что именно делает это расширение?Codepage Converter - это расширение, предоставляющее функции конверсии строк из стандартных однобайтовых системных кодировок в N-байтовую (чаще всего двух-) кодировку UTF-8. И обратно.
Его рекомендуется использовать при обмене строками с расширениями, написанными под приём и отправку строк в однобайтовых кодировках (такими являются подавляющее большинство расширений, написанных до появления GM 8.1). То есть, перед отправкой строки в такое расширение её необходимо сначала перекодировать в необходимую однобайтовую кодировку, а при получении строкового результата оттуда сконвертировать его в UTF-8, после чего уже использовать в GM.
Таким образом, достигается полная совместимость между GM 8.1 и старыми расширениями.
Как использовать это расширение?Codepage Converter прост, как апельсин. Существует два способа его использования:
//ext_get_string() и ext_give_string() являются воображаемыми функциями, введёнными в пример для иллюстрации принципа работы
//первая возвращает однобайтовую строку, вторая ожидает однобайтовую строку
//переменная, в которую мы будем записывать результат, получаемый из наших воображаемых функций ;)
var result_str;
//ПЕРВЫЙ СПОСОБ: ГЛОБАЛЬНЫЙ
//установка кодировки ANSI-1251 для всех стандартных процессов конвертации
set_cpconv(1251);
//получение однобайтового строкового результата из функции и его конвертация из предустановленной однобайтовой кодировки в UTF-8
result_str = to_utf8(ext_get_string());
//конвертация строки из UTF-8 в предустановленную однобайтовую кодировку и последующая отправка в функцию
ext_give_string(from_utf8(result_str));
//ВТОРОЙ СПОСОБ: ИНДИВИДУАЛЬНЫЙ
//получение однобайтового строкового результата из функции и его конвертация из кодировки ANSI-1251 в UTF-8
result_str = to_utf8_alt(ext_get_string(), 1251);
//конвертация строки из UTF-8 в ANSI-1251 и последующая отправка в функцию
ext_give_string(from_utf8_alt(result_str, 1251));
Полное описание всех функций, а также предобъявленных констант, можно прочитать в файле ReadMe.txt, вложенном в архив с расширением.
Тем не менее, в принципе работы Codepage Converter'а есть некоторые особенности, которые рекомендуется учитывать:
1. Если в отправляемой или получаемой строке гарантированно содержатся только символы стандартной 7-битной кодировки ASCII (символы в диапазоне 0-127, к ним относятся цифры, базовые знаки препинания и арифметических операций, символы латинского алфавита, а также некоторые технические символы), то конвертация в/из UTF-8 не требуется, так как UTF-8 полностью совместим с 7-битной кодировкой ASCII. А поскольку она не требуется, то её лучше и не использовать. :)
2. При выборе устанавливаемой для конвертационных процессов кодировки тоже требуется осторожность. Если планируется конвертировать интерфейсную строку, то лучше устанавливать конкретную однобайтовую кодовую таблицу, которая соответствует языку интерфейса (например, для русского языка это будет кодировка ANSI-1251). Если же конвертированию подлежит строка, которая в теории может выглядеть по-разному на разных системах (например, путь к папке на одном компьютере может выглядеть как "C:\Games\ВашаИгра\", а на другом - "C:\Games\????????\"), то тогда лучше использовать стандартную системную кодировку (для её использования в расширении обозначена константа CP_ACP).
Как работает это расширение?Codepage Converter использует для конвертирования строк WinAPI-функции
MultiByteToWideChar() и
WideCharToMultiByte(). Это значит, что расширение совместимо только с Windows-версиями GM. Тем не менее, если кто-нибудь захочет переписать это расширение в целях расширения функциональности, увеличения производительности, уменьшения его размера, создания кроссплатформенной версии или ещё чего-нибудь, я буду только "за".
БлагодарностиБлагодарю
Станислава "trew" Будинова с
русского форума FreeBASIC за помощь в разъяснении принципов работы используемых в расширении функций WinAPI.
Скачать (~5 Кб; .7z)Предыдущие версии в сумме были скачаны 24 раза. =)
Если у вас есть какие-нибудь вопросы, пожелания или замечания, то обязательно задавайте их здесь. Я буду только рад вам ответить.

Надеюсь, эта штука окажется полезной. Учитывая любовь русских GM-игроделов к созданию русских интерфейсов.
