2009-08-13 8 views
0

Je me demande si vous êtes au courant d'un quelconque article qui montre comment rendre un code complètement unicode? La raison que je demande est parce que je suis en train de traiter avec winapi en ce moment et il semble que tout est censé être unicode comme L "blabla" .. Les fonctions que j'ai rencontrées ne fonctionneront pas correctement.tutoriels sur WinAPI unicode?

Merci!

+0

Il me semble que vous comprenez déjà tout cela déjà. Vous devez toujours utiliser L "pour définir un tableau de caractères Unicode – toto

+1

Vous pouvez utiliser' std :: wstring' à la place de 'std :: string' – jalf

Répondre

3

Lorsque l'un de mes projets doivent être compilés avec UNICODE sur et en dehors, je l'habitude d'utiliser la définition suivante pour créer une chaîne de STL qui utilise TCHAR au lieu de CHAR et wchar_t:

#ifdef _UNICODE 
    typedef std::wstring tstring; 
#else 
    typedef std::string tstring; 
#endif 

ou les éléments suivants peuvent travailler aussi:

typedef std::basic_string<TCHAR> tstring; 

Dans mon projet ensemble, je vais ensuite définir toutes les chaînes comme TString et utiliser la _T() macro pour créer les chaînes correctement. Lorsque vous appelez ensuite une API WIN32, utilisez simplement la méthode .c_str() sur la chaîne.

+0

J'utilise aussi cette astuce, +1 –

0

En ce qui concerne votre dernière instruction, si vous parlez de std :: string, utilisez plutôt std :: wstring.

Toto a déjà répondu à la question clé: utilisez simplement L"", WCHAR/wchar_t et wstring partout où vous utiliseriez normalement "", char et string.

Si vous avez besoin de convertir entre unicode et ansi, vous trouverez les dragons. dragons très mauvais qui vous mangeront vivant si vous ne comprenez pas les pages de code, UTF8, et ainsi de suite. mais pour la plupart des applications, c'est le cas de 2%, si c'est le cas. le reste est facile tant que vous restez tout-unicode.

+3

Lorsque vous travaillez beaucoup avec WinAPI, je vous conseille d'utiliser ATL 'CString' sur' std :: wstring' - il utilise les fonctions de manipulation de texte Win32, il s'harmonise ainsi avec les paramètres régionaux de Windows et est plus facile à utiliser avec des fonctions qui prennent des pointeurs 'WCHAR *' bruts (comme toutes les fonctions API) 'std :: wstring' –

0

Unicode pour les applications Windows peuvent être résumées avec quelques règles simples:

  • Dans vos paramètres de projet dans Visual Studio choisissez Unicode (FYI: sous Windows, Unicode est toujours UTF16).
  • Obtenez une fonction UTF8 à UTF16 et une fonction UTF16 à UTF8. (Vous pouvez l'écrire vous-même ou le trouver sur internet, j'utilise personnellement ceux des bibliothèques Poco C++).
  • Dans votre code, utilisez toujours std :: string pour vos interfaces de classe et de fonction.
  • Lorsque vous devez utiliser un appel WinAPI prenant un paramètre de chaîne, vous pouvez utiliser les fonctions de conversion pour remplir un std :: wstring local, sur lequel vous pouvez appeler la méthode c_str() pour la transmettre à la fonction API.
  • Si vous devez obtenir des données textuelles à partir d'une fonction WinAPI, vous devez généralement créer un tableau TCHAR local sur la pile, le passer à la fonction, construire un std :: wstring à partir du résultat, puis le convertir en std :: string en utilisant votre fonction de conversion UTF16 vers UTF8.

Exemples:

obtention de texte à l'aide de tableau alloué pile

std::string getCurrentDirectory() 
{ 
    TCHAR buffer[MAX_PATH]; 
    ::GetCurrentDirectory(sizeof(buffer)/sizeof(TCHAR), &buffer[0]); 
    return std::string(ToUTF8(buffer)); 
} 

Obtention d'un texte en utilisant un tampon allouée dynamiquement

std::string getWindowText(HWND inHandle) 
{ 
      std::string result; 
      int length = ::GetWindowTextLength(inHandle); 
      if (length > 0) 
      { 
        TCHAR * buffer = new TCHAR[length+1]; 
        ::GetWindowText(inHandle, buffer, length+1); 
        result = ToUTF8(buffer); 
        delete [] buffer; 
      } 
      return result; 
} 

texte de réglage

void setWindowText(HWND inHandle, const std::string & inText) 
{ 
    std::wstring utf16String = ToUTF16(inText); 
    if (0 == ::SetWindowText(inHandle, utf16String.c_str())) 
    { 
     ReportError("Setting the text on component failed. Last error: " + getLastError(::GetLastError())); 
    } 
} 

Espérons que cela aide.

+1

Si toute l'API native est UTF-16, pourquoi voudrait-on aller à std: string à chaque fois? Rester UTF-16, utiliser CString (ATL) ou std: wstring, et seulement aller UTF -8 "au bord" (pour les protocoles d'importation/exportation/communication, stockage, etc.) –

+0

Vous avez raison de pouvoir utiliser UTF-16 par défaut et de le convertir en UTF-8 pour l'interfaçage extérieur, mais vous êtes aussi Comme la plupart des bibliothèques utilisent UTF8 et que Windows utilise UTF16, je choisis de définir mon "edge" au niveau de WinAPI. niveau d'acing. – StackedCrooked