UTF-8 Do ficheiro para TextBox VC ++ 6.0
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.
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.