Domanda

Stiamo riscontrando problemi nell'impostare le didascalie delle finestre usando caratteri cirillici o giapponesi. Vediamo punti interrogativi o immondizia casuale, ma non il testo che vogliamo. Abbiamo provato a utilizzare codifiche diverse, SetWindowText (), SetWindowTextW (), SetWindowTextA () e così via. Non riusciamo nemmeno a farlo funzionare passando una stringa letterale a SetWindowText ().

La nostra installazione di Windows sembra avere tutto ciò di cui ha bisogno, ad esempio Internet Explorer e Firefox mostrano correttamente le didascalie in cirillico e giapponese. Quindi sono abbastanza sicuro che non stiamo trovando la combinazione codifica / metodo corretta. Qualche suggerimento?

È stato utile?

Soluzione

SetWindowText () ? Hai compilato la tua domanda come Unicode? In caso contrario, SetWindowText () equivale a SetWindowTextA () , che a sua volta è limitato alle impostazioni internazionali correnti del sistema (aka " Language per applicazioni non Unicode ").

Inoltre, come hai CREATO la tua finestra? Usando un'API esplicitamente compatibile con Unicode come CreateWindowExW () ? In caso contrario, assicurati che il tuo programma sia compilato come Unicode.

Se il tuo programma non è compilato come Unicode, potresti voler modificare la tua lingua " per applicazioni non Unicode " in CP / Opzioni regionali. Riavvio richiesto. O più facilmente: usa MS AppLocale per simulare un locale cirillico

Altri suggerimenti

Il problema che hai (a indovinare) è che la finestra frame di livello superiore della tua applicazione è una finestra ANSI. Sotto il cofano, quando si crea una finestra (con CreateWindow () o CreateWindowEx ()) è necessario fornire una classe di finestra. Questa classe di finestra determina le proprietà della finestra, incluso se, per impostazione predefinita, accetta messaggi ANSI o messaggi Unicode. A sua volta, questo viene impostato dal fatto che tu (o il tuo framework) registri la classe window chiamando RegisterClassExA () o RegisterClassExW ().

Quello che quasi sicuramente sta accadendo è che la classe della tua finestra di livello superiore viene registrata con RegisterClassExA (). Ciò significa che la procedura predefinita per la finestra tradurrà tutte le stringhe Unicode nei messaggi in ANSI prima di elaborarle, quindi i punti interrogativi e i caratteri dispari ovunque.

La soluzione più semplice a tutto ciò è semplicemente rendere l'applicazione Unicode in tutto (solitamente eseguita definendo _UNICODE). L'altro modo è capire dove viene chiamato RegisterClassEx () e renderlo RegisterClassExW (). Ciò può causare problemi ANSI / Unicode con altri messaggi, ma dovrebbe (almeno in teoria) funzionare. Naturalmente, in entrambi i casi si romperà Windows 9X, se questo è un problema.

Se tutto ciò sembra orribilmente complicato, non ti sbagli ...

Devi compilare la tua applicazione con _UNICODE definito. Altrimenti tutte le finestre rimarranno comunque MBCS e non utf-16 e quindi non possono mostrare caratteri cirillici o giapponesi se la tabella codici non corrisponde.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top