Question

Nous ne parvenons pas à définir les légendes des fenêtres à l’aide de caractères cyrilliques ou japonais. Nous voyons des points d’interrogation ou des ordures aléatoires, mais pas le texte que nous voulons. Nous avons essayé d'utiliser différents codages, SetWindowText (), SetWindowTextW (), SetWindowTextA (), etc. Nous ne pouvons même pas le faire fonctionner en passant un littéral de chaîne à SetWindowText ().

Notre installation Windows semble avoir tout ce dont elle a besoin - Internet Explorer et Firefox affichent correctement les légendes cyrilliques et japonaises, par exemple. Donc, je suis presque sûr que nous ne trouvons pas la bonne combinaison encodage / méthode. Des suggestions?

Était-ce utile?

La solution

SetWindowText () ? Avez-vous compilé votre application en tant que Unicode? Sinon, SetWindowText () équivaut à SetWindowTextA () , qui est à son tour limité à l'environnement local actuel du système (ou "Langage pour les applications non Unicode").

Aussi, comment avez-vous CRÉÉ votre fenêtre? Utilisation d'une API explicitement compatible Unicode telle que CreateWindowExW () ? Sinon, assurez-vous que votre programme est compilé au format Unicode.

Si votre programme n'est pas compilé au format Unicode, vous pouvez modifier votre " Langage pour les applications non Unicode " dans CP / Options régionales. Redémarrage nécessaire. Ou plus facilement: utilisez MS AppLocale pour simuler un environnement local cyrillique

Autres conseils

Le problème que vous avez (à deviner) est que la fenêtre de cadre de niveau supérieur de votre application est une fenêtre ANSI. Sous le capot, lorsque vous créez une fenêtre (avec CreateWindow () ou CreateWindowEx ()), une classe de fenêtre doit être fournie. Cette classe de fenêtre détermine les propriétés de la fenêtre, y compris si elle accepte ou non les messages ANSI ou Unicode, par défaut. À son tour, cela est défini selon que vous (ou votre infrastructure) enregistrez la classe de fenêtre en appelant RegisterClassExA () ou RegisterClassExW ().

Ce qui se passe certainement, c’est que la classe de votre fenêtre de niveau supérieur est en cours d’enregistrement auprès de RegisterClassExA (). Cela signifie que la procédure de fenêtre par défaut pour la fenêtre traduira toutes les chaînes Unicode des messages en ANSI avant de les traiter, d'où les points d'interrogation et les caractères impairs partout.

La solution la plus simple consiste à rendre votre application entièrement Unicode (généralement en définissant _UNICODE). L'autre méthode consiste à déterminer où RegisterClassEx () est appelé et à en faire RegisterClassExW (). Cela peut entraîner des problèmes ANSI / Unicode avec d'autres messages, mais cela devrait (en théorie, au moins) fonctionner. Bien sûr, l’un ou l’autre des cas casse Windows 9X, si cela pose un problème.

Si tout cela vous semble horriblement compliqué, vous ne vous trompez pas ...

Vous devez compiler votre application avec _UNICODE défini. Sinon, toutes les fenêtres seront toujours au format MBCS et non pas à utf-16 et ne pourront donc pas afficher de caractères cyrilliques ou japonais si la page de code ne correspond pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top