Игра для Windows: UTF-8, UTF-16, DirectX и Lua

Разрабатываю игру под windows для обучения (изучаю DirectX). Я бы хотел, чтобы он имел поддержку UTF.

Прочитав этот вопрос, я узнал, что Windows использует wchar_t, то есть UTF-16. Я хочу, чтобы в моей игре была поддержка сценариев Lua, а Lua не особо любит Unicode. , Он просто обрабатывает строки как «поток байтов»; это работает достаточно хорошо для UTF-8, но UTF-16 было бы практически невозможно использовать.

Короче говоря: Windows хочет UTF-16, lua хочет UTF-8.

Поэтому я подумал, давайте просто использовать UTF-8 с обычными char* и string! .length() будет испорчено, но кого это волнует? Однако это не работает:

const char test_utf8[] = { 111, 108, 0xc3, 0xa9, 0 }; // UTF-8 for olè
mFont->DrawTextA(0, test_utf8, -1, &R, DT_NOCLIP, BLACK);
    /* DrawText is a Direct3d function to, well, draw text.
     * It's like MessageBox: it is a define to either DrawTextA
     * or DrawTextW, depending if unicode is defined or not. Here
     * we will use DrawTextA, since we are passing a normal char*. */

Это печатает olé. Другими словами, он использует не UTF-8, а ISO-8859-1. .

Так что я могу сделать? Я могу думать о следующем:

  1. Откажитесь от идеи UTF; используйте ISO-8859-1 и будьте счастливы (это то, что делает World of Warcraft, по крайней мере, для версии enUS)
  2. Преобразовывать каждую строку в каждом кадре из UTF-8 в UTF-16 (хотя я беспокоюсь о проблемах с производительностью, учитывая, что это будет делать это 60+ раз в секунду для каждой строки, и это O (N). Я довольно уверен, что это будет довольно медленно)
  3. Для каждой строки lua сохраните копию UTF-16; огромная трата памяти, очень сложная для реализации (поддержание строк UTF-16 в актуальном состоянии, когда они меняются в Lua и т. д.)

person Thomas Bonini    schedule 26.02.2010    source источник
comment
Вам необходимо преобразовать символ UTF-8 char* (или std::string) в широкую строку, прежде чем использовать его с API-интерфейсами Windows. К счастью, в API есть функция для этого, но я не помню, как она называется.   -  person Tronic    schedule 27.02.2010
comment
Почему вы не можете сохранить все свои строки в формате UTF-16? Вы все равно хотите, чтобы строки не попадали в ваш код в ресурсах, верно?   -  person John Knoeller    schedule 27.02.2010
comment
@John: это, вероятно, строки, генерируемые в сценариях Lua (и, следовательно, неподконтрольные базовой программе).   -  person Amber    schedule 27.02.2010


Ответы (4)


Он также не использует 8859-1, он использует локальную кодовую страницу вашей системы. Вы можете преобразовать в UTF16 и использовать DrawText(), самостоятельно преобразовав строку. Если ваша библиотека классов не имеет поддержки, вы можете использовать MultiByteToWideChar().

person Hans Passant    schedule 26.02.2010

Я бы не был шокирован, если бы WoW не использовал методы рисования текста DirectX. Наличие собственного пользовательского решения для рисования текста дает вам гораздо больше гибкости в поддержке кодировок. Это не слишком сложно.

person Torlack    schedule 26.02.2010
comment
Это на самом деле не плохая идея. Есть ли у вас какие-либо ссылки на документы/учебники/и т. д., которые объясняют, как это сделать? (У PS закончились голоса, проголосую через 60 минут) - person Thomas Bonini; 27.02.2010

Вы можете заставить lua кэшировать ваши преобразования в UTF-16.

utf16 = setmetatable ( {} , { __index = function ( t , k , v )
        local utf16str = my_conversion_func_to_utf16 ( v )
        rawset ( t , k , utf16str )
        return utf16str
    end } )

тогда просто все ваши функции принимают только строковые типы utf16 (которые могут быть строкой lua или какими-то пользовательскими данными (которые могут быть вашим массивом wchar_t))

Я могу помочь больше, если вы не понимаете...

person daurnimator    schedule 27.02.2010

í•œêµì–´/ì¡°ì„ ë§. Я постоянно вижу это в StarCraft, потому что у него нет надлежащей поддержки Unicode.

Веди хороший бой! Используйте UTF-8. Преобразовывать в UTF-16 каждый кадр (если нет лучшего способа сделать это, упомянутого в документах, на которые мне лень смотреть). Не беспокойтесь о производительности здесь, пока это не станет проблемой!

person Joey Adams    schedule 26.02.2010