使用WideCharToMultiByte转换LPCWSTR。需要帮忙

时间:2009-03-02 01:56:44

标签: winapi unicode string

我有这样的功能:

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等),但结果是字符串的乱码(直到淡紫色)。建议?

2 个答案:

答案 0 :(得分:2)

我看到两个问题;

1)您将'0'传递给WideCharToMultiByte以获取多字节缓冲区的大小。如果您阅读文档,则会导致函数返回所需的NUMBER个字节但不执行实际转换。 (这是为了让您随后分配一个正确大小的缓冲区并调用该函数)。

2)在file.write中,sizeof(AnsiBuffer)将导致写入255个字节,无论缓冲区中是什么。 sizeof是一个编译时计算,它返回变量的大小。你应该用代表字符串长度的'written'变量替换它。

答案 1 :(得分:1)

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

这是正确的电话, 255 位于正确的位置:

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