2014-11-11 19 views
6

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" 
} 
+1

Le stringhe non dovrebbero essere UTF-16 anziché UTF-8? –

+0

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. –

+1

@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

risposta

6

ho trovato a reference from 2002 indica che è necessario dire al compilatore di risorse come viene codificato il file RC. Per UTF-8, che è il codice pagina 65001, quindi dovrete eseguire questo:

 
brcc32 -c65001 lang.rc 

Poi, naturalmente, ci si rimuove la parte 'lang.rc' dalla direttiva $R nel codice, perché non si desidera più l'IDE per invocare il compilatore di risorse stesso.

Se la versione di Delphi è abbastanza recente, è possibile mantenere l'intera direttiva $R e impostare l'opzione -c65001 nello resource-compiler configuration delle opzioni di progetto.

È difficile conoscere la codifica di un file solo guardandolo. Ci possono essere molte ipotesi valide. L'opzione -c è documentata, ma the documentation non menziona quando è necessario utilizzarlo, o ciò che l'IDE utilizza quando lo esegue il compilatore di risorse. L'IDE probabilmente utilizza solo l'impostazione predefinita, la stessa di brcc32.exe, che è la tabella codici ANSI predefinita del sistema.

+0

Non puoi semplicemente impostare Project -> Options -> Resource Compiler -> Additional options a '-c65001' (usando Delphi XE3 qui)? Questo ha funzionato per me. – spurgeon

+0

Grazie per averlo menzionato. Ho aggiornato la risposta. L'ultima versione di Delphi che ho usato non aveva questa opzione. –

+0

Risposta molto bella ad una domanda molto bella! –