Игра для Windows: UTF-8, UTF-16, DirectX и Lua - PullRequest
2 голосов
/ 27 февраля 2010

Я занимаюсь разработкой игры для Windows в целях обучения (я изучаю DirectX). Я хотел бы иметь поддержку UTF.

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

Короче говоря: Windows хочет UTF-16, Луа хочет 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) I Я уверен, что это будет довольно медленно)
  3. Для каждой строки lua сохраняйте копию UTF-16; огромная трата памяти, очень сложная для реализации (поддержание актуальности строк UTF-16 при их изменении в Lua и т. д.)

Ответы [ 4 ]

5 голосов
/ 27 февраля 2010

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

2 голосов
/ 27 февраля 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))

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

1 голос
/ 27 февраля 2010

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

1 голос
/ 27 февраля 2010

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

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

...