2009-06-29 8 views
3

Je souhaite donc utiliser SetThreadLocale pour définir une page de codes de threads sur UTF8. Jusqu'à présent, j'utilisais le deuxième paramètre des macros de conversion de chaîne d'ATL comme "CT2A (szBUF, CP_UTF8)" pour faire ceci. Mais je veux être en mesure de définir la page de code de thread une fois au début avec SetThreadLocale() et ne jamais avoir à utiliser le deuxième paramètre de la macro de conversion à nouveau.SetThreadLocale et UTF8

Comment faire? SetThreadLocale ne prendra pas un paramètre de page de code comme CP_UTF8, juste un LCID. Quels paramètres dois-je nourrir SetThreadLocale pour y parvenir? N'oubliez pas, je n'ai pas de langage particulier en tête. Les chaînes que je reçois pourraient être japonaises, coréennes, anglaises etc. Jusqu'à présent, je n'ai aucun problème avec ce mélange de chaînes lorsque je spécifie CP_UTF8 comme second paramètre d'une macro de conversion. Vous pouvez demander "bien alors pourquoi ne pas continuer à utiliser le second paramètre". Réponse, "car il peut être facilement oublié par les membres de l'équipe qui travaillent sur le code.Il serait bien si cela fonctionnerait correctement en utilisant la version 1 par défaut de la macro de conversion."

Répondre

5

SetThreadLocale attend un identificateur de langue, mais UTF-8 n'est pas un identificateur de langue - c'est un codage Unicode. L'un des objectifs de l'ID de terrain est de dire au système comment traiter un texte ANSI compris entre 128 et 255. Étant donné un langage réel, sa page de codes sera utilisée pour traiter de tels caractères. UTF-8, OTOH, est une représentation compressée du texte Unicode. Pour créer du texte UTF-8, votre entrée doit être Unicode. Étant donné le texte ANSI, vous ne saurez pas comment convertir la plage de caractères supérieure. C'est comme cela quand c'est fait "manuellement", pour convertir ANSI en UTF-8, vous devez d'abord utiliser MultiByteToWideChar avec une page de code spécifiée, et seulement alors pouvez-vous convertir la chaîne Unicode en UTF-8.

Maintenant, revenons à votre question - J'irais dans un autre sens. Si le parametre de page de codes supplementaire vous cause un probleme, fabriquez une macro qui le cache (ou herite la classe CT2A et a le second parametre fixe).

+0

Cette explication a du sens, merci. Oui, je pense que je vais juste utiliser le deuxième paramètre. Ne semble pas être un moyen facile de définir une page de code pour le fil une fois. –

Questions connexes