Pergunta

Estamos tendo legendas de janela configuração problemas para usar os caracteres cirílicos ou japoneses. Nós, quer ver pontos de interrogação ou lixo aleatório, mas não o texto que queremos. Nós tentei usar diferentes codificações, SetWindowText (), SetWindowTextW (), SetWindowTextA (), e assim por diante. Não podemos sequer fazê-lo funcionar por meio de um literal string para SetWindowText ().

A nossa instalação do Windows parece ter tudo o que precisa - Internet Explorer e Firefox mostram cirílico e legendas em japonês corretamente, por exemplo. Então, eu tenho certeza que nós estamos não encontrar a combinação de codificação / método correto. Alguma sugestão?

Foi útil?

Solução

SetWindowText()? Você compilar o aplicativo como Unicode? Se não, SetWindowText () é equivalente a SetWindowTextA(), que por sua vez está limitado à sua localidade do sistema atual (aka "Idioma para aplicações não-Unicode").

Além disso, como é que você CRIAR sua janela? Usando uma API Unicode-aware explicitamente como CreateWindowExW()? Se não, certifique-se de que seu programa é compilado como Unicode.

Se o seu programa não é compilado como Unicode, você pode querer ou modificar o seu "idioma para aplicativos não-Unicode" na CP / Opções Regional. Reinicialização necessária. Ou mais facilmente: Use MS AppLocale para simular um sistema cirílico locale

Outras dicas

O problema que você tem (a um palpite) é que a janela do quadro de nível superior do seu aplicativo for um janela ANSI. Sob o capô, quando você cria uma janela (com CreateWindow () ou CreateWindowEx ()) uma classe de janela deve ser fornecido. Esta classe de janela determina as propriedades da janela, incluindo ou não, por padrão, aceita mensagens ANSI ou mensagens Unicode. Por sua vez, isso é definido pelo fato de você (ou seu framework) registrar a classe janela chamando RegisterClassExA () ou RegisterClassExW ().

O que está quase certamente happing é que a classe de sua janela de nível superior está sendo registrado com RegisterClassExA (). Isto significa que o procedimento de janela padrão para a janela irá traduzir todas as cadeias de caracteres Unicode em mensagens para ANSI antes de processá-los, portanto, os pontos de interrogação e caracteres estranhos em todos os lugares.

A solução mais fácil para tudo isso é apenas para fazer a sua inscrição Unicode todo (geralmente feito através da definição de _UNICODE). A outra maneira é descobrir onde RegisterClassEx () está sendo chamado, e torná-lo RegisterClassExW (). Isso pode causar problemas de ANSI / Unicode com outras mensagens, mas o trabalho que deveria (em teoria, pelo menos). É claro que, de qualquer forma vai quebrar Windows 9X, se isso é um problema.

Se tudo isso soa terrivelmente complicado, você não está errado ...

Você tem que compilar o aplicativo com _UNICODE definido. Caso contrário, todas as janelas ainda será MBCS e não utf-16 e, portanto, não pode mostrar caracteres cirílicos ou japoneses, se a página de código não corresponde.

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