UTF-8 in TLabel.Caption

di il
6 risposte

UTF-8 in TLabel.Caption

Ciao,

localizzo l'interfaccia caricando le risorse da un INI language file codificato UTF-8.

fMain.lblBmpOpacity.Caption := GetLanguageString('lblBmpOpacity', fMain.lblBmpOpacity.Caption);

Normalmente funziona bene, ma in alcuni casi, tra i quali le TLabel.Caption, i vocali accentati (ad es. è, ì), Umlaut ecc. non vengono visualizzati correttamente (ad es. "OpacitÃ" invece di "Opacità").

Ho risolto aggiungendo UTF8ToString al valore result della funzione GetLanguageString applicando così UTF8ToString a tutte le risorse, anche se ora compilando appare “[dcc64 Warning] W1058 Implicit string cast with potential data loss from ‘string’ to ‘RawByteString'”:

Result := UTF8ToString(LanguageIni.ReadString('Resources', ResourceId, DefaultValue));

Esiste un metodo generale per abilitare il supporto UTF-8 per il completo progetto Delphi?

Ale

6 Risposte

  • Re: UTF-8 in TLabel.Caption

    21/05/2024 - al.delphi ha scritto:


    i vocali accentati

    Da quando le vocali sono diventate i vocali?  :-)

  • Re: UTF-8 in TLabel.Caption

    Sorry, se finiva con la “e” (aka “le vocale”) mi accorgevo prima. : )

  • Re: UTF-8 in TLabel.Caption

    21/05/2024 - al.delphi ha scritto:


    Esiste un metodo generale per abilitare il supporto UTF-8 per il completo progetto Delphi?

    Non ha senso parlare di UTF-8 abilitato “per il progetto completo”: è uno standard di trasformazione Unicode che viene utilizzato laddove serve, e io potrei avere una interfaccia che fa uso di Unicode (es. UTF-16, come effettivamente è) con la quale devo caricare un file di testo che è codificato UTF-8, per trasferire poi dati via seriale codificati con ANSI.

    Come vedi, il controllo Label ti accetta tranquillamente i caratteri Unicode, ma non quando li carichi dal file INI: ciò significa che quel file INI viene caricato usando l'encoding errato.

    Come accedi al file INI? Posta il codice.

    Già che ci sei, dai un'occhiata agli overload del costruttore di TMemIniFile (se usi questa classe).

  • Re: UTF-8 in TLabel.Caption

    Ciao Alka,

    carico le risorse tramite la seguente function:

    function GetLanguageString(ResourceID: string; DefaultValue: string): string;
    var
     LanguageINI: TMemIniFile;
    begin
     LanguageINI := TMemIniFile.Create(LgPath + IntToStr(LgID) + '.lng');
     try
       if NOT LanguageINI.ValueExists('Resources', ResourceID) then
         begin
           LanguageINI.WriteString('Resources', ResourceID, DefaultValue);
           LanguageINI.UpdateFile;
         end;
       Result := LanguageINI.ReadString('Resources', ResourceID, DefaultValue);
     finally
       LanguageINI.Free;
     end;
    end;

    I files *.lng sono codificati UTF-8 oppure UTF-8-BOM.

    Ale

  • Re: UTF-8 in TLabel.Caption

    21/05/2024 - al.delphi ha scritto:


    I files *.lng sono codificati UTF-8 oppure UTF-8-BOM.

    Perfetto: se guardi la riga in cui crei l'istanza di TMemIniFile tramite la chiamata al costruttore Create(), vedrai che c'è un solo parametro, ovvero il percorso del file da caricare. E l'encoding da utilizzare, quello dov'è? :)

    Aggiungi l'encoding desiderato:

    TMemIniFile.Create(LgPath + IntToStr(LgID) + '.lng', TEncoding.UTF8)
  • Re: UTF-8 in TLabel.Caption

    Ooooh, boia del copia&incolla! Almeno così sparisce il fastidioso warning. : )

    Grazie mille, Alka!

Devi accedere o registrarti per scrivere nel forum
6 risposte