2009-03-02 79 views
0

我有这样的功能:使用WideCharToMultiByte转换LPCWSTR。需要帮助

BOOL WINAPI MyFunction(HDC hdc, LPCWSTR text, UINT cbCount){ 

char AnsiBuffer[255]; 
int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 0, NULL, NULL); 
if(written > -1) AnsiBuffer[written] = '\0'; 

if(written>0){ 

    ofstream myfile; 
    myfile.open ("C:\\example.txt", ios::app); 
    myfile.write(AnsiBuffer, sizeof(AnsiBuffer)); 
    myfile.write("\n", 1); 
    myfile.close(); 

} 


.... 

当我显示与MessageBoxW()输入文本LPCWSTR,文本显示了罚款。当我尝试将其转换为多字节时,返回值看起来很正常(例如:22,45等),但结果是一些废话(“从中国电子出版社出版)。建议?

+0

注意,您可以使用wofstream写的Unicode(宽)字符串的文件。 http://msdn.microsoft.com/en-us/library/f1d6b0fk(VS.80).aspx – Andy 2009-03-02 02:13:32

回答

2

我看到两个问题;

1)您将'0'传递给WideCharToMultiByte以获取多字节缓冲区的大小。如果您阅读文档,则会返回所需的字节数,但不会执行实际转换。 (这是为了让您随后分配正确大小的缓冲区并调用该功能)。 2)in file.write sizeof(AnsiBuffer)将导致写入255个字节,而不管缓冲区中的内容如何。 sizeof是一个编译时计算,它返回一个变量的大小。你应该用代表字符串长度的'书面'变量替换它。

1

您需要将缓冲区的长度传递给API,而不是传递0。当您通过0时,该函数将返回所需的缓冲区长度,但不会写入该缓冲区。您会看到未初始化数组的结果。

这里是正确的判罚,用在正确的地方:

int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 255, NULL, NULL);