* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 16, 2024, 07:24:14 am

Inserisci il nome utente, la password e la durata della sessione.

77 Visitatori, 0 Utenti

Autore Topic: [RISOLTO] Gestione vocali accentate  (Letto 1023 volte)

AlexLazarus

  • Jr. Member
  • **
  • Post: 91
  • Karma: +1/-0
[RISOLTO] Gestione vocali accentate
« il: Novembre 09, 2022, 06:23:34 pm »
Sto entrando leggermente in confusione (come al solito).
Dunque...
Riesco a leggere correttamente una vocale accentata, ma non a gestirla.
Nell'esempio che allego il programma non ha problemi nel leggere il carattere Car (cui è associata la vocale accentata) né nel "concatenarla" con altri caratteri. Tuttavia (a quanto pare) a ogni vocale accentata vengono associati TRE caratteri, probabilmente si tratta del codice esadecimale (vedi secondo screenshot).
Il fatto è che dopo aver estratto da una stringa una vocale accentata, vorrei un "qualcosa" che mi dica: "La vocale accentata è: à" in modo che possa sottoporla a elaborazione successiva (Tipo: IF Car := 'è' THEN ... eccetera).

P.S. Ho già letto https://forum.lazarus.freepascal.org/index.php/topic,31387.0.html ma purtroppo non è molto chiaro.

Come fare?
Codice: [Seleziona]
{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
Var I:Integer;
  Car, Parola: String;
begin

     Parola:= '';
     For I := 1 to Length(Edit1.Text) do
       Begin
         Car:= Copy(Edit1.Text,I,1);
         ShowMessage(Car);
         Parola:= Parola + Car;
       End;
     Label1.Caption:='Parola: ' + Parola + ' Lunghezza: ' + IntToStr(Length(Parola));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2.Caption:=('Lunghezza stringa: ' + IntToStr(Length(Edit1.text)));
end;

end.
« Ultima modifica: Novembre 10, 2022, 10:30:09 am da AlexLazarus »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Gestione vocali accentate
« Risposta #1 il: Novembre 09, 2022, 07:07:49 pm »
Ciao, volevo già porre l'attenzione su questo fatto in uno dei tuoi precedenti post, ma sembrava un pò off topic.

Attualmente, tenuto conto delle lingue che esistono al mondo non si possono più gestire i caratteri al vecchio modo (ANSI, CP, .....).

Tutti i caratteri diversi da quelli inglesi standard (codice ASCII da 32 a 127) vengono trattati come codifica UNICODE, ad esempio UTF8, UTF16.

Il carattere quindi non è più di un BYTE (in realtà il carattere, vedi il C++, non è più da tempo di un BYTE ma è formato da almeno due BYTE) ma bensi può arrivare ad essere anche di 4 byte.

Non puoi trattare caratteri con CHR o ORD in generale.

Adesso non ho tempo ma cerca LAZARUS e UTF8 e dovresti vedere un pò di luce.

Ciao

:) Ogni alba è un regalo, ogni tramonto è una conquista :)

giacomarko

  • Full Member
  • ***
  • Post: 105
  • Karma: +6/-0
Re:Gestione vocali accentate
« Risposta #2 il: Novembre 09, 2022, 07:16:45 pm »
fai poi attenzione agli operatori

...in modo che possa sottoporla a elaborazione successiva...
Codice: [Seleziona]
(Tipo: IF Car := 'è' THEN ... eccetera).

non puoi usare
Codice: [Seleziona]
if
con
Codice: [Seleziona]
:=
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Gestione vocali accentate
« Risposta #3 il: Novembre 09, 2022, 10:31:31 pm »
Eccomi. Qui un esempio su come iterare su una stringa con caratteri utf8.
Codice: [Seleziona]
//Inserire nella Uses:
Uses LazUtf8;

procedure TForm1.Button1Click(Sender: TObject);
var tempstr: string;
    car: string;
    UTtempstr: UnicodeString;
    UTcar: Unicodestring;
    i: integer;
begin
  tempstr := '这些是汉字';
  UTtempstr := tempstr;
  ShowMessage(tempstr);
  for i := 0 to UTF8Length(tempstr)-1 do
    begin
      car := Utf8Copy(tempstr, i+1, 1);
      ShowMessage(car);
      //Questo è solo un esempio.
      //Si possono usare le funzioni Utf8 per fare la ricerca (PosEx) o altro
      if car = '是' then
        ShowMessage('Carattere trovato');
    end;
  ShowMessage('Modo alternativo');
  //Ulteriore metodo con le stringhe Unicode
  for UTcar in UTtempstr do
    ShowMessage(UTcar)
end;

PS: inserito metodo alternativo.
« Ultima modifica: Novembre 09, 2022, 11:46:12 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

Mimmo

  • Jr. Member
  • **
  • Post: 76
  • Karma: +3/-0
Re:Gestione vocali accentate
« Risposta #4 il: Novembre 10, 2022, 09:31:29 am »
Ciao,
il tipo string di default in Lazarus è codificato con UTF-8 e qui trovi qualche delucidazione: https://wiki.lazarus.freepascal.org/String
Tu ricordati che Length considera la stringa come un array di byte/caratteri, da qui il disallineamento logico che ti si è presentato. La stringa "àèìòù" ad esempio a livello di byte è lunga 10. Copy si comporta in modo allineato a Length, per cui il tuo ciclo di copia funziona come risultato finale (il for frullerebbe 10 volte nell'esempio). Anche Pos ragiona sempre come array di byte.
Quindi fintanto che li usi combinati per copiare o spezzettare stringhe, normalmente fila tutto liscio.
Se hai bisogno di manipolare la stringa ragionando per carattere, devi invece utilizzare le chiamate che ti ha fatto vedere DragoRosso.
Altre info le trovi qui: https://wiki.freepascal.org/Unicode_Support_in_Lazarus e qui: https://wiki.lazarus.freepascal.org/UTF8_strings_and_characters

AlexLazarus

  • Jr. Member
  • **
  • Post: 91
  • Karma: +1/-0
Re:Gestione vocali accentate
« Risposta #5 il: Novembre 10, 2022, 10:18:05 am »
non puoi usare
Codice: [Seleziona]
if
con
Codice: [Seleziona]
:=
Sì, va be', era solo per indicare uno "schema" di applicazione. Ovvio che ci suole solo (=) e non (:=)-

AlexLazarus

  • Jr. Member
  • **
  • Post: 91
  • Karma: +1/-0
Re:Gestione vocali accentate
« Risposta #6 il: Novembre 10, 2022, 10:25:54 am »
Eccomi. Qui un esempio su come iterare su una stringa con caratteri utf8.
...eccetera


GRANDISSIMO! (Non è che mi poi mandi la fattura per le consulenze, eh?) 🤔

Inserisco qui di seguito il mio modesto contributo (intero listato) e lo screenshot.
A proposito dei messaggi di errore, in molti programmi me ne compaiono spesso ma sembra che nonostante i vari "Warning" e le "Note" tutto funzioni sempre, senza problemi. Mah, non capisco, ma mi adeguo. (cit.)
Grazie ancora!
Codice: [Seleziona]
unit a_2022_11_09_Lazarus_vocali_pas;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, LazUtf8;
// LazUtf8 inserita nella uses per gestire vocali accentate

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
Var I:Integer;
  Car, Parola: String;
begin
     Parola:= '';
     For I := 1 to Length(Edit1.Text) do
       Begin
         Car:= Copy(Edit1.Text,I,1);
         ShowMessage(Car);
         Parola:= Parola + Car;
       End;
     Label1.Caption:='Parola: ' + Parola + ' Lunghezza: ' + IntToStr(Length(Parola));
end;

procedure TForm1.Button2Click(Sender: TObject);
// Gestione vocali accentate
// LazUtf8 inserita nella uses per gestire vocali accentate
var tempstr: string;
    car: string;
    UTtempstr: UnicodeString;
    // UTcar: Unicodestring;
    i: integer;
begin
     tempstr := edit1.Text;
     UTtempstr := tempstr;
  ShowMessage(tempstr);
  for i := 0 to UTF8Length(tempstr)-1 do
    begin
      car := Utf8Copy(tempstr, i+1, 1);
            //Si possono usare le funzioni Utf8 per fare la ricerca (PosEx) o altro
      if (car = 'à') OR (car = 'è') OR (car = 'é') OR (car = 'ì') OR (car = 'ò') Or (car = 'ù') then
            // ShowMessage('Carattere trovato');
        ListBox1.items.add('Pippo'+car);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label2.Caption:=('Lunghezza stringa: ' + IntToStr(Length(Edit1.text)));
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
 Label3.Caption:=('Stringa selezionata: ' + ListBox1.items.strings[ListBox1.itemindex]);
end;

end.
« Ultima modifica: Novembre 10, 2022, 10:28:30 am da AlexLazarus »

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1266
  • Karma: +43/-0
  • Prima ascoltare, poi decidere
Re:Gestione vocali accentate
« Risposta #7 il: Novembre 10, 2022, 02:14:43 pm »
A proposito dei messaggi di errore, in molti programmi me ne compaiono spesso ma sembra che nonostante i vari "Warning" e le "Note" tutto funzioni sempre, senza problemi. Mah, non capisco, ma mi adeguo. (cit.)

I warning e le note (o hint in altri ambienti) sono messaggi di avvertimento che ti allertano su qualcosa di "sospetto" oppure ti consigliano qualche azione: tipici esempi sono le conversioni automatiche oppure l'indicazione di una variabile dichiarata ma non usata.

Normalmente ce ne sono a decine e una occhiata magari và data, ma nella stragrande maggioranza dei programmi si può tranquillamente ignorare.

P.S.: ho visto dopo il tuo screenshot, e guarda caso calza a pennello con quello che ti ho scritto.

Ciao
« Ultima modifica: Novembre 10, 2022, 02:18:11 pm da DragoRosso »
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 80
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 77
Total: 77

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.