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