我有这样的功能:
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 :(得分: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);