Retornando caracteres japoneses via char * em um XLOPER Excel
Pergunta
Eu estou recuperando caracteres japoneses a partir de uma fonte de dados e eu quero voltar este dados para o Excel em uma XLOPER. Eu estou usando uma versão japonesa do Excel 2003 (daí XLOPERs e não XLOPER12s).
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;
O pszReturn parâmetro é atribuído a um XLOPER. O problema que tenho é que “? ? ? ? ? ??” é apresentado como “ƒAƒtƒŠƒJ,Ì- ‰ ¤” em Excel.
manualmente definir a página de código a 932 produz os mesmos resultados como CP_THREAD_ACP então eu acho que essa parte está correta.
Qualquer ajuda seria muito apreciada.
Solução
erro do usuário!
O código acima é bom. O problema é que Excel foi usando a página de código errado. Eu não tinha definido o idioma para programas não-unicode para japonês no Painel de Controle.
O código agora trabalha para a versão em Inglês Excel também.
Foi um dia e meio bem gasto ...
Outras dicas
char * é uma sequência de bytes, interpretados utilizando o conjunto de caracteres corrente. Para ser precose, que é a codificação usada pelo partido fazendo a interpretação. Neste caso, Execl está recebendo um conjunto de caracteres que deve ser interpretados usando página de código 932, mas em vez Excel está usando uma outra página de código.
A solução, como sempre é Unicode, no Excel representado por XLOPER12