我正在从数据源检索日文字符,我想在XLOPER中将此数据返回到Excel。我使用的是日语版的Excel 2003(因此是XLOPER而不是XLOPER12)。
wchar_t* pszW = OLE2W(bstrResult); //I have the data I am trying to copy in a CComBSTR
ULONG ulSize = ::WideCharToMultiByte( CP_THREAD_ACP, 0, pszW, -1, NULL, 0, NULL, NULL );
if ( ulSize )
{
char* tmp = new char[ulSize + 1];
tmp[ulSize]='\0';
::WideCharToMultiByte( CP_THREAD_ACP, 0, pszW, -1, LPSTR( tmp ), ulSize, NULL, NULL );
pszReturn = tmp;
}
wchar_t* pwszOut = new wchar_t[bstrResult.Length () + 1];
//now turn it back to test that that the correct code page was used. For debugging purposes only!
::MultiByteToWideChar (CP_THREAD_ACP,0, LPSTR(pszReturn),-1,pwszOut,bstrResult.Length () + 1);
//pwszOut and bstrResult look the same in the debugger
delete [] pwszOut;
参数pszReturn被分配给XLOPER。我的问题是“アフリカの女王”在Excel中显示为“ƒAƒtƒŠƒJ,Ì-¤”。
手动将代码页设置为932会产生与CP_THREAD_ACP相同的结果,因此我认为该部分是正确的。
非常感谢任何帮助。
答案 0 :(得分:2)
用户错误!
上面的代码很好。问题是Excel使用了错误的代码页。我没有在控制面板中将非unicode程序的语言设置为日语。
该代码现在也适用于英文版的Excel。
这花了一天半的时间......
答案 1 :(得分:0)
char *是一个字节序列,使用当前字符集进行解释。要预先确定,这是执行解释的一方使用的字符集。在这种情况下,Execl正在接收使用代码页932解释应的字符集,而Excel正在使用另一个代码页。
解决方案,一如既往地是Unicode,在XLOPER12代表的Excel中