2010-02-26 6 views
2

Je développe un jeu pour les fenêtres à des fins d'apprentissage (j'apprends DirectX). Je voudrais qu'il soit supporté par l'UTF.de Windows jeu: UTF-8, UTF-16, DirectX et Lua

Reading this question J'ai appris que Windows utilise wchar_t, qui est UTF-16. Je veux que mon jeu prenne en charge les scripts Lua, et Lua doesn't really like Unicode much .. Il traite simplement les chaînes comme un "flux d'octets"; cela fonctionne assez bien pour UTF-8, mais UTF-16 serait pratiquement impossible à utiliser.

Longue histoire courte: fenêtres veut UTF-16, Lua veut UTF-8.

Alors j'ai pensé, utilisons simplement UTF-8 avec char* et string! .length() sera foiré mais qui s'en soucie? Cependant, il ne fonctionne pas:

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*. */ 

Cette imprime olé. En d'autres termes, il ne semble pas utiliser UTF-8 mais plutôt ISO-8859-1.

Alors, que puis-je faire? Je peux penser à ce qui suit:

  1. Abandonner l'idée de UTF; utiliser ISO-8859-1 et être heureux (ce que World of Warcraft fait, au moins pour la version enUS)
  2. Convertir chaque chaîne à chaque image de UTF-8 en UTF-16 (je suis inquiet les problèmes de performance, cependant, étant donné qu'il le fera plus de 60 fois par seconde pour chaque chaîne et il est O (N) Je suis sûr que ce sera assez lent)
  3. pour chaque chaîne de lua conserver une copie UTF-16; énorme perte de mémoire, très difficile à mettre en œuvre (en gardant les UTF-16 chaînes à jour quand ils changent en Lua, etc.)
+0

vous devez convertir l'UTF-8 char * (ou std :: string) dans la chaîne large avant de l'utiliser avec API Windows Heureusement, l'API contient une fonction pour cela, mais je ne me souviens plus de ce qu'on appelle. – Tronic

+1

Pourquoi ne conservez-vous pas toutes vos chaînes au format UTF-16?Vous voulez garder les chaînes de votre code dans les ressources de toute façon, non? –

+0

@John: ce sont probablement des chaînes générées dans les scripts Lua (et donc hors du contrôle du programme de base). – Amber

Répondre

5

Il n'utilise 8859-1 soit, il utilise la page de code local de votre système . Vous pouvez convertir en UTF16 et utiliser DrawText() en convertissant la chaîne vous-même. Si votre bibliothèque de classes n'a aucun support, vous pouvez utiliser MultiByteToWideChar().

1

í • œêμì-'/ ì¡ ° ì « ë§. Je le vois tout le temps dans StarCraft parce qu'il ne supporte pas correctement Unicode.

Combattez le bon combat! Utilisez UTF-8. Convertir en UTF-16 chaque image (à moins qu'il y ait une meilleure façon de le faire mentionné dans les documents que je suis trop paresseux à regarder). Ne vous inquiétez pas de la performance ici jusqu'à ce que cela devienne un problème!

1

Je ne serais pas choqué est WoW ne pas utiliser les méthodes de tirage de texte DirectX. Avoir votre propre solution de dessin de texte personnalisé vous donne beaucoup plus de flexibilité dans votre soutien pour les encodages. Ce n'est pas trop dur.

+0

Ce n'est pas une mauvaise idée. Avez-vous des liens vers des documents/tutoriels/etc qui expliquent comment faire cela? (PS a manqué de voix, sera upvote dans 60 minutes) –

2

Vous pouvez obtenir lua pour mettre en cache vos conversions UTF-16

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

alors que toutes vos fonctions ne prendre que les types de chaînes de utf16 (qui pourrait être une chaîne de Lua ou une sorte de userdata (qui pourrait être votre tableau de wchar_t))

je peux aider plus si vous ne comprenez pas ...