Convertir la chaîne de caractères ASCII à Unicode? Windows, pure C
J'ai trouvé des réponses à cette question pour de nombreux langages de programmation, à l'exception de C, à l'aide de l'API Windows. Pas de C++ réponses s'il vous plaît. Considérez les points suivants:
#include <windows.h>
char *string = "The quick brown fox jumps over the lazy dog";
WCHAR unistring[strlen(string)+1];
Quelle fonction dois-je utiliser pour remplir unistring avec les personnages de chaîne?
Ne unicode dire UTF16-LE ici?
Veuillez préciser ce que codage tu veux dire, "Unicode" n'est pas un encodage, il ne vous dit pas comment représenter les caractères sous forme de bits dans la mémoire.
Ce serait UCS-2, pas UTF16-LE...
ok, dans contextuel de windows unicode signifiait généralement UTF16-LE donc, j'ai deviné le mal 😛
Voir ma réponse.
Veuillez préciser ce que codage tu veux dire, "Unicode" n'est pas un encodage, il ne vous dit pas comment représenter les caractères sous forme de bits dans la mémoire.
Ce serait UCS-2, pas UTF16-LE...
ok, dans contextuel de windows unicode signifiait généralement UTF16-LE donc, j'ai deviné le mal 😛
Voir ma réponse.
OriginalL'auteur user1540336 | 2012-07-20
Vous devez vous connecter pour publier un commentaire.
MultiByteToWideChar
:Correction: UCS-2 peut encoder plus que le BMP, mais en le faisant, vous laissant le codage de gamme où UCS-2 et UTF-16 sont compatibles pour la plupart.
Je n'ai pas pris la peine de tests de différences de moi-même, mais ce blog Microsoft dit que depuis XP il a vraiment été UTF-16 pas UCS-2.
En réalité, UTF-16 "est devenu de plus entièrement pris en charge", quoi que cela puisse signifier. Ceci c'est beaucoup plus instructif, bien qu'il indique que dans Win2K "pas tous les composants du système sont compatibles avec les caractères supplémentaires" et aussi loin que je pouvais voir, c'est le dernier épisode de ce document, laissant personne de deviner ce qui pourrait encore se cacher dans les profondeurs de l'API. Le fait demeure que le fait d'avoir un 16 bits WCHAR est simple et tout simplement mal, parce que c'est multi-octets, pas large. Je continue de recommander l'ICU sur toute natif C API.
OriginalL'auteur Rup
Si vous êtes vraiment sérieux au sujet de l'Unicode, vous devez vous référer à International Components for Unicode, qui est une solution multi-plateforme pour la manipulation des conversions Unicode et de stockage en C ou C++.
Votre
WCHAR
, par exemple, est pas Unicode pour commencer, parce que Microsoft a quelque peu prématurément définiwchar_t
à 16 bits (UCS-2), et s'est coincé dans la compatibilité descendante de l'enfer lors de l'Unicode est devenu 32bit: UCS-2 est presque, mais pas assez identique à l'UTF-16, ce dernier étant en fait un encodage multi-octets comme de l'UTF-8. "Grand" format Unicode moyens 32 bits (UTF-32), et même alors vous n'avez pas une relation 1:1 entre les points de code (c'est à dire 32 bits-valeurs) et de l'abrégé des personnages (c'est à dire la version imprimable de glyphe).Gratuituous, losely liste des liens:
OriginalL'auteur DevSolar
Vous devriez regarder dans MultiByteToWideChar fonction.
OriginalL'auteur pive_
Vous pouvez utiliser
mbstowcs
pour convertir de "multi-octets" à l'échelle des chaînes de caractères.[N]
va allouerN
WCHAR
. Il aurait été correct si c'était unchar
tableau.Hein? Bien sûr
WCHAR unistring[n]
se réserve nWCHAR
s, donc pas besoin d'échelle. Sinonint x[4]
serait il vous suffit de réserver un entier sur 4 octets entier système?Ah zut, je pensais rapide encore!
Ouais, retiré défectueux choses.
OriginalL'auteur Some programmer dude
C'est une autre façon de le faire. Ce n'est pas aussi direct, mais quand vous n'avez pas envie de taper dans les 6 arguments dans un ordre bien précis, et se rappeler les numéros de page de codes/macros pour
MultiByteToWideChar
, il fait le travail. Prend 16 microsecondes sur ce portable à effectuer, la plupart de celui-ci(9 microsecondes) passé dansAddAtomW
.De référence, MultiByteToWideChar prend entre 0 et 1 microsecondes.
OriginalL'auteur Dmitry