2014-04-19 1 views
0

Je viens juste de commencer à créer des modules natifs pour IIS7. J'utilise l'un des exemples Hello World de http://msdn.microsoft.com/en-us/library/ms689348(v=vs.90).aspx. Exemple de code écrit là fonctionne très bien. Maintenant, j'essaye de changer ce code pour supporter l'encodage UTF-8 à afficher dans le navigateur. J'ai fait les changements suivants:Support UTF-8 dans VC++ pour application web

//1. Changed here to include ;charset=UTF-8 in Http Header Content Type 
pHttpResponse->SetHeader(HttpHeaderContentType, "text/plain;charset=UTF-8", (USHORT)strlen("text/plain;charset=UTF-8"), TRUE); 
//2. Changed here data type as PCTSTR which is PCWSTR(16-bit) since I have UNICODE defined. 
PCTSTR pszBuffer = L"Hello World!"; 
HTTP_DATA_CHUNK dataChunk; 
dataChunk.DataChunkType = HttpDataChunkFromMemory; 
DWORD cbSent; 
dataChunk.FromMemory.pBuffer = (PVOID)pszBuffer; 
//3. Changed here to calculate length using wcslen. 
dataChunk.FromMemory.BufferLength = (USHORT)wcslen(pszBuffer); 
hr = pHttpResponse->WriteEntityChunks(&dataChunk, 1, FALSE, TRUE, &cbSent); 

Mon premier doute est de savoir comment faire chaîne pszBuffer UTF-8? Le deuxième doute est comment calculer la longueur de ceci correctement (code sur le commentaire numéro 3)?

Existe-t-il un autre moyen d'écrire une réponse au lieu de créer un tampon, un chunk, etc.?

+0

Vous pouvez utiliser des bibliothèques pour travailler avec Unicode, comme http://utfcpp.sourceforge.net/ (évitez simplement MBCS!) Vérifiez également MSDN: http://msdn.microsoft.com/en-us/library/ cwe8bzh0.aspx – Dai

Répondre

1

Si vous souhaitez que la chaîne littérale soit UTF-8, définissez le codage du fichier source sur UTF-8 sans nomenclature. Ensuite, vous pouvez utiliser un littéral de chaîne normal comme UTF-8. Utilisez WideCharToMultiByte et MultiByteToWideChar pour convertir entre chaîne UTF-16 et UTF-8. Si votre projet utilise ATL, vous pouvez utiliser des macros de conversion de chaîne fournies par ATL pour convertir facilement entre UTF-16 et UTF-8; voir http://msdn.microsoft.com/en-us/library/87zae4a3.aspx pour l'utilisation.

Si vous avez besoin du nombre d'octets dans une chaîne, utilisez strlen sur une chaîne UTF-8.

Une autre façon d'écrire une réponse est d'utiliser HTTP_DATA_CHUNK::FromFileHandle au lieu de HTTP_DATA_CHUNK::FromMemory. HTTP_DATA_CHUNK::FromFileHandle accepte un handle de fichier à utiliser comme réponse.

Questions connexes