web-dev-qa-db-fra.com

En C++ quand utiliser WCHAR et quand utiliser CHAR

J'ai une question:

Certaines bibliothèques utilisent WCHAR comme paramètre de texte et d'autres utilisent CHAR (comme UTF-8): j'ai besoin de savoir quand utiliser WCHAR ou CHAR lorsque j'écris ma propre bibliothèque.

11
user2179256

Utilisez char et traitez-le comme UTF-8. Il y a beaucoup de raisons à cela. ce site web le résume beaucoup mieux que moi:

http://utf8everywhere.org/

Il recommande de convertir de wchar_t à char (UTF-16 à UTF-8) dès que vous le recevez depuis n'importe quelle bibliothèque et de le reconvertir lorsque vous devez lui passer des chaînes. Donc, pour répondre à votre question, utilisez toujours char sauf si une API nécessite que vous transmettiez ou receviez wchar_t.

17
Ben Hymers

WCHAR (ou wchar_t sur le compilateur Visual C++) est utilisé pour Unicode UTF-16 strings.
Il s'agit du codage de chaîne "natif" utilisé par les API Win32.

CHAR (ou char) peut être utilisé pour plusieurs autres formats de chaîne: ANSI, MBCS, UTF-8.

UTF-16 étant le codage native des API Win32, vous pouvez utiliser WCHAR (et mieux une classe de chaîne appropriée basée sur celle-ci, telle que std::wstring) à la limite de l'API Win32, dans votre application.

Et vous pouvez utiliser UTF-8 (donc, CHARchar et std::string) pour échanger votre texte Unicode en dehors des limites de votre application. Par exemple: UTF-8 est largement utilisé sur Internet, et lorsque vous échangez du texte UTF-8 entre différentes plates-formes, vous n’avez pas le problème de l’endianisme (à la place, avec UTF-16, vous devez tenir compte à la fois du format UTF-16BE _ big-endian et les cas UTF-16LE little-endian).

Vous pouvez convertir les formats UTF-16 et UTF-8 à l’aide des API Win32 WideCharToMultiByte() et MultiByteToWideChar(). Ce sont des API pur-C, qui peuvent être encapsulées dans du code C++, en utilisant des classes de chaîne au lieu de pointeurs de caractères bruts et des exceptions au lieu de codes d’erreur bruts. Vous pouvez trouver un exemple de cela ici

3
Mr.C64

La bonne question n'est pas quel type utiliser, mais quel doit être votre contrat avec les utilisateurs de votre bibliothèque. Char et wchar_t peuvent signifier plus d'une chose.

Pour moi, la bonne réponse est d'utiliser char et de considérer tout ce qui est encodé en utf-8, comme le suggère utf8everywhere.org. Cela facilitera également l'écriture de bibliothèques multi-plateformes. 

Assurez-vous cependant de bien utiliser les chaînes. Certaines API, comme fopen (), acceptent une chaîne char * et la traitent différemment (pas comme UTF-8) lors de la compilation sous Windows. Si Unicode est important pour vous (et c'est probablement le cas lorsque vous manipulez des chaînes), assurez-vous de gérer vos chaînes correctement. Un bon exemple peut être vu dans boost :: locale. Je recommande également d'utiliser boost :: nowide sous Windows pour que les chaînes soient traitées correctement dans votre bibliothèque.

3

Sous Windows, nous nous en tenons à WCHARS. std :: wstring. Principalement parce que si vous ne le faites pas, vous devez convertir parce que vous appelez des fonctions Windows. 

J'ai le sentiment qu'essayer d'utiliser utf8 en interne simplement à cause de http://utf8everywhere.org/ va nous en mordre plus tard.

1
Epirocks

Il est conseillé de recourir aux TCHAR lors du développement d’une application Windows. La bonne chose à propos des TCHAR est qu’ils peuvent être des caractères normaux ou des caractères wchars, selon que le paramètre unicode est défini ou non. Une fois que vous utilisez les TCHAR, vous vous assurez que toutes les manipulations de chaîne que vous utilisez commencent également par le préfixe _t (par exemple, _tcslen pour la longueur de la chaîne). Ainsi, vous saurez que votre code fonctionnera à la fois dans les environnements Unicode et ASCII.

0
armanali