Ho problemi con i caratteri Unicode visualizzati in modo errato sulla mia interfaccia utente. Ho una DLL di sola risorsa contenente una tabella di stringhe utilizzata per la localizzazione dell'interfaccia utente. Creo la DLL in Delphi XE3 con un progetto solo per DLL (ha solo {$R 'lang.res' 'lang.rc'}
nel file DPR e mi dà lang.dll
). Ho verificato che il mio file lang.rc è in formato UTF-8 con interruzioni di riga di Windows CRLF. Quando carico le stringhe dalla DLL, i caratteri Unicode sono confusi sull'interfaccia. Ecco alcuni dettagli.Impostazione della didascalia Unicode da una stringa DLL DLL Tabella
un frammento dalla tabella di stringhe:
STRINGTABLE
{
59,"180˚"
60,"90˚ CW"
61,"90˚ CCW"
}
Qui ci sono frammenti di codice che illustrano il problema che sto avendo con caratteri Unicode:
// explicitly assigning the degrees character shows 180˚ properly
ImageMenu180Action.Caption := '180˚';
// getting the resource from the DLL shows some weird two-character string for the degrees character
ImageMenu90CWAction.Caption := TLangHelper.LoadStr(IDS_ImageMenuRotationCW90);
// OutputDebugString shows the degrees character in the debugger output correctly
OutputDebugString(PChar('IDS_ImageMenuRotationCW90: '+TLangHelper.LoadStr(IDS_ImageMenuRotationCW90)));
Qui è la mia funzione di Delphi utilizzato per le stringhe di carico dalla risorsa DLL:
class function TLangHelper.LoadStr(ResourceId: Integer):String;
var
Buff: String;
L: Integer;
begin
Result := '';
if LangDllHandle = 0 then begin
LangDllHandle := LoadLibrary(LANGUAGE_DLL_LOCATION);
if LangDllHandle = 0 then begin
ShowMessage('Error loading language localization resources.');
end;
end;
if LangDllHandle <> 0 then begin
L := 1024;
SetLength(Buff, L+1);
LoadString(LangDllHandle, ResourceId, PChar(Buff), L);
Result := String(PChar(Buff));
end;
end;
Qualche suggerimento?
FOLLOW-UP:
per i caratteri cinesi, ho dovuto aggiungere una L precedente alle definizioni di stringa nel file RC in modo che la compilazione DLL li riconobbe come Unicode. Per esempio (inglese, cinese tradizionale, cinese semplificato, francese):
STRINGTABLE
{
35,"Status Bar"
1035,L"狀態欄"
2035,L"状态栏"
3035,"Barre d'état"
}
Le stringhe non dovrebbero essere UTF-16 anziché UTF-8? –
Dove hai visto che usare UTF-8 nel tuo file .rc porterebbe alla giusta codifica nel file .res? Ho trovato [un riferimento dal 2002] (http://www.delphipages.com/forum/archive/index.php/t-63889.html) che dice che è necessario utilizzare una speciale opzione da riga di comando per brcc32 ('- c65001') per dirgli la codifica del file .rc. Dubito che l'IDE utilizzi questa opzione per impostazione predefinita. –
@RobKennedy Questo ha funzionato, lo apprezzo molto. Per mancanza di documentazione che affermi in altro modo (non sono riuscito a trovarne alcuna), ho assunto che brcc32 avrebbe di default la codifica testuale del file. Cattiva presunzione. Sembra che questa roba dovrebbe essere meglio documentata. Non posso essere l'unico a provare a farlo. Accetterò una risposta se vuoi scriverne una. – spurgeon