Разрабатываю игру под 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. а>.
Так что я могу сделать? Я могу думать о следующем:
- Откажитесь от идеи UTF; используйте ISO-8859-1 и будьте счастливы (это то, что делает World of Warcraft, по крайней мере, для версии enUS)
- Преобразовывать каждую строку в каждом кадре из UTF-8 в UTF-16 (хотя я беспокоюсь о проблемах с производительностью, учитывая, что это будет делать это 60+ раз в секунду для каждой строки, и это O (N). Я довольно уверен, что это будет довольно медленно)
- Для каждой строки lua сохраните копию UTF-16; огромная трата памяти, очень сложная для реализации (поддержание строк UTF-16 в актуальном состоянии, когда они меняются в Lua и т. д.)