Pergunta

Como faço para obter um ++ 6.0 programa MFC VC velho a ler e UTF8 exibição em uma caixa de texto ou MessageBox? De preferência sem quebrar qualquer da leitura de arquivos e exibindo que está escrito lá (bastante substancial).

Eu li uma linha em CString strstr, então usei esse código:

int nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,strStr,1024,0,0);
wchar_t * pWCMessage = new wchar_t[ nLengthNeeded ];

MultiByteToWideChar(CP_UTF8,0,strStr,1024,pWCMessage,nLengthNeeded);

nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,"Error Title",50,0,0);
wchar_t * pWCTitle = new wchar_t[ nLengthNeeded ];
MultiByteToWideChar(CP_UTF8,0,"Error Title",50,pWCTitle,nLengthNeeded);

MessageBoxW(NULL,pWCMessage,pWCTitle,MB_ICONINFORMATION);

Ainda não sei como eu iria colocá-lo em uma caixa de texto, mas acontece que eu não preciso fazer isso de qualquer maneira.

Foi útil?

Solução

Eu sinto que isso não será útil, mas é um ponto de partida ... Eu estou supondo que isso não acontece 'apenas trabalho', e eu não acho que você quer tentar andar com código maluco páginas que pode ou não pode obter o que você quer.

Como sobre apenas usando MultiByteToWideChar (CP_UTF8, ...) para convertê-lo para UTF16 e, em seguida, chamar as versões W dessas funções (ou definir UNICODE / _UNICODE para o projeto).

Eu sei que vai trabalhar para MessageBox, e eu não posso imaginar a caixa de texto não tem suporte a Unicode.

Se você precisa para obter a parte de trás saída para UTF8 -. Apenas usar WideCharToMultiByte ()

Outras dicas

dar uma olhada em:

WideCharToMultiByte e para uma informação mais geral

quando / se você tiver problemas, certifique-se de postar seu código. Tem sido um tempo desde que eu fiz isso e me lembro de ele ser um pouco complicado.

Converter a string utf8 primeiro a uma grande cadeia com a API MultiByteToWideChar , passando CP_UTF8 para o parâmetro codepage. Se o seu aplicativo é compilado com _UNICODE definido, agora você pode passar a seqüência de largura para a sua caixa de texto.

Se o seu aplicativo no entanto é compilado como uma aplicação MBCS, você tem que converter a grande volta string para MBCS com WideCharToMultiByte , passando CP_ACP como o parâmetro de página de código.

É seu aplicativo Unicode. Se sim, fallback para a resposta de Stefan:

MyDisplayableUtf16String = MultiByteToWideChar (CP_UTF8, MyUtf8String, ...)

Eu vou assumir que não é tão simples: Seu aplicativo é ANSI. Primeiro de tudo, você precisa converter a string para UTF16 como mostrado acima. Depois, há um gargalo: A sua seqüência de UTF8 conter caracteres ouside a página de código atual do sistema (aka "Idioma para aplicações não-Unicode")? Se não, converter a cadeia UTF16 para a localidade do sistema usando

MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...)

(ou o uso um dos ATL macros / MFC, como W2A(MyUtf16String))

e está feito.

Else a string não pode ser convertida para ANSI, o que significa que você vai ter um ... aham ... tempo difícil tentar exibi-lo em uma caixa de caixa de texto ou mensagem ANSI.

Como Joe apontou, você pode exibir o texto em uma caixa de mesage usando

MessageBoxW (..., MyDisplayableUtf16String, ...)

O arrasto W indica a versão Unicode (UTF16) do API.

Exibindo a corda em uma caixa de texto continuará a ser difícil, porém: Você precisaria criar programmaticaly caixa de texto como Unicode janela usando CreateWindowExW(). Que eu acredito que não vai funcionar se a janela pai da caixa de texto (diálogo, frame?) Não é uma janela Unicode.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top