Pregunta

Tenemos problemas para configurar los subtítulos de las ventanas con caracteres cirílicos o japoneses. O bien vemos signos de interrogación o basura aleatoria, pero no el texto que queremos. Hemos intentado usar diferentes codificaciones, SetWindowText (), SetWindowTextW (), SetWindowTextA (), y así sucesivamente. Ni siquiera podemos hacerlo funcionar pasando un literal de cadena a SetWindowText ().

Parece que nuestra instalación de Windows tiene todo lo que necesita: Internet Explorer y Firefox muestran subtítulos en cirílico y japonés correctamente, por ejemplo. Así que estoy bastante seguro de que no estamos encontrando la combinación correcta de codificación / método. ¿Alguna sugerencia?

¿Fue útil?

Solución

SetWindowText () ? ¿Compiló su aplicación como Unicode? Si no, SetWindowText () es equivalente a SetWindowTextA () , que a su vez está limitado a la configuración regional actual del sistema (también conocido como " Idioma para aplicaciones que no son Unicode ").

Además, ¿cómo CREÓ tu ventana? ¿Está utilizando una API explícitamente compatible con Unicode como CreateWindowExW () ? Si no, asegúrate de que tu programa esté compilado como Unicode.

Si su programa no está compilado como Unicode, es posible que desee modificar su " Idioma para aplicaciones que no sean Unicode " en CP / Opciones regionales. Reinicio requerido. O más fácilmente: use MS AppLocale para simular una configuración regional del sistema cirílico

Otros consejos

El problema que tiene (supuestamente) es que la ventana de marco de nivel superior de su aplicación es una ventana ANSI. Bajo el capó, cuando crea una ventana (con CreateWindow () o CreateWindowEx ()) se debe proporcionar una clase de ventana. Esta clase de ventana determina las propiedades de la ventana, incluso si, de forma predeterminada, acepta mensajes ANSI o mensajes Unicode. A su vez, esto se establece si usted (o su marco) registran la clase de ventana llamando a RegisterClassExA () o RegisterClassExW ().

Lo que es casi seguro es que la clase de su ventana de nivel superior se está registrando con RegisterClassExA (). Esto significa que el procedimiento de ventana predeterminado para la ventana traducirá todas las cadenas Unicode en mensajes a ANSI antes de procesarlos, por lo tanto, los signos de interrogación y los caracteres impares en todas partes.

La solución más fácil para todo esto es hacer que su aplicación sea Unicode en todo momento (generalmente se hace definiendo _UNICODE). La otra forma es averiguar dónde se llama a RegisterClassEx () y hacerlo RegisterClassExW (). Esto puede causar problemas ANSI / Unicode con otros mensajes, pero debería (en teoría, al menos) funcionar. Por supuesto, de cualquier manera romperá Windows 9X, si eso es un problema.

Si todo esto suena terriblemente complicado, no te equivocas ...

Debe compilar su aplicación con _UNICODE definido. De lo contrario, todas las ventanas seguirán siendo MBCS y no utf-16 y, por lo tanto, no podrán mostrar caracteres cirílicos o japoneses si la página de códigos no coincide.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top