用于Web应用程序的VC ++中的UTF-8支持

时间:2014-04-19 06:41:05

标签: c++ visual-c++ utf-8 iis-7 httpmodule

我刚刚开始为IIS7创建本机模块。我正在使用http://msdn.microsoft.com/en-us/library/ms689348(v=vs.90).aspx中的一个Hello World示例。在那里写的示例代码工作正常。现在我正在尝试更改此代码以支持在浏览器中显示UTF-8编码。我做了以下更改:

//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);

我的第一个疑问是如何制作pszBuffer UTF-8字符串?

第二个疑问是如何正确计算这个长度(注释号3上的代码)?

还有其他方法可以写入响应而不是创建缓冲区,chunck等。

1 个答案:

答案 0 :(得分:1)

如果要将字符串文字设置为UTF-8,请将源文件的编码设置为不带BOM的UTF-8。然后你可以使用普通的字符串文字作为UTF-8。使用WideCharToMultiByteMultiByteToWideChar在UTF-16和UTF-8字符串之间进行转换。

如果你的项目使用ATL,你可以使用ATL提供的字符串转换宏来轻松转换UTF-16和UTF-8;请参阅http://msdn.microsoft.com/en-us/library/87zae4a3.aspx了解如何使用它。

如果您需要字符串中的字节数,请在UTF-8字符串上使用strlen

撰写回复的另一种方法是使用HTTP_DATA_CHUNK::FromFileHandle代替HTTP_DATA_CHUNK::FromMemoryHTTP_DATA_CHUNK::FromFileHandle接受要用作响应的文件句柄。