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

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

Recenti

How To

Utenti
Stats
  • Messaggi totali: 20.582
  • Totale discussioni: 2.471
  • Online today: 310
  • Online ever: 5.949 (Luglio 30, 2026, 09:49:59 PM)
Utenti online
  • Users: 0
  • Guests: 11
  • Total: 11
11 Visitatori, 0 Utenti

[Risolto] Caratteri non più leggibili con le nuove versioni di Lazarus

Aperto da tito_livio, Novembre 12, 2024, 12:57:16 AM

Discussione precedente - Discussione successiva

tito_livio

#15
Citazione di: DragoRosso il Novembre 12, 2024, 05:27:56 PM
Mi riesci a passare i valori esadecimali della stringa che leggi e i caratteri che dovrebbero essere visualizzati ... in cinque minuti dovrei risolverti il problema.
Ok grazie per la spiegazione, avevo capito un'altra cosa.
In allegato ho messo lo screenshot per i valori della variabile in esadecimale.
Il valore che dovrebbe visualizzare è: àèìòù @€#

Invece visualizza altri caratteri strani. Per quello che ho trovato in rete la vecchia codifica dovrebbe essere cp1252 o win-1252 che dovrebbe essere la stessa cosa.
Sempre grazie per la tua disponibilità,
ciao

Aggiungo: non ho messo la colonna data address ma risulta vuota come nel tuo esempio

bonmario

Citazione di: tito_livio il Novembre 12, 2024, 07:41:32 PM
MySQL50Connection1.CharSet := 'CP1252';
mi da errore:
Failed to set connection character set: Can't initialize character set cp1252 in c:\program Files\MySql\MySql server 5.0\share\charsets\
E in effetti in quella cartella CP1252.xml non c'è mentre ci sono altri codepage come cp1250,cp1252 ecc.

Prova a vedere se con questa risolvi:
  function ConvertiStringa(St: String; TipoConvStr: TTipoOperConvStr): String;
  begin
    {$IFDEF MSWINDOWS}
      case TipoConvStr of
        tocLeggi: St:={CP1252ToUTF8(St)}WinCPToUTF8(St);
        tocScrivi:  St:={UTF8ToCP1252(St)}UTF8ToWinCP(St);
      end;
    {$ENDIF}
    Result:=St;
  end;


Di solito era la mia ultima spiaggia quando non avevo più voglia di sbatterci la testa...
Per usarla, devi aggiungere "LazUTF8" alla uses.

P.S. Se non funziona con tocLeggi, prova con tocScrivi


Ciao, Mario

DragoRosso

Citazione di: tito_livio il Novembre 12, 2024, 10:58:25 PM
In allegato ho messo lo screenshot per i valori della variabile in esadecimale.
Il valore che dovrebbe visualizzare è: àèìòù @€#

I valori passati sono una combinazione già UTF-8 con "caratteri di controllo", per aggiungere una dieresi ad esempio ad una lettera normale.
Quella stringa è già stata elaborata e non è usabile.

Ma scusa, i dati che hai presentato sono stati inseriti con il vecchio programma ?

A questo punto non saprei aiutarti, sembra che ciò che leggi dal DB venga codificato in UTF-8 con il nuovo Lazarus. Però il problema è che i dati interni probabilmente sono in caratteri standard ANSI.

Prova a cercare in rete, se hai questo problema sicuramente anche qualcun altro l'ha avuto.

Mi sembra comunque molto strano ciò che accade, dovrebbe avere colpito tantissime applicazioni.

N.B.: comunque i dati dovrebbe "essere" in formato CP-1252 o Windows-1252 in quanto alcuni caratteri che hai presentato esistono solo in quelle codifiche.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

tito_livio

Citazione di: DragoRosso il Novembre 13, 2024, 10:00:21 AM

Ma scusa, i dati che hai presentato sono stati inseriti con il vecchio programma ?

A questo punto non saprei aiutarti, sembra che ciò che leggi dal DB venga codificato in UTF-8 con il nuovo Lazarus. Però il problema è che i dati interni probabilmente sono in caratteri standard ANSI.

Prova a cercare in rete, se hai questo problema sicuramente anche qualcun altro l'ha avuto.

Mi sembra comunque molto strano ciò che accade, dovrebbe avere colpito tantissime applicazioni.

N.B.: comunque i dati dovrebbe "essere" in formato CP-1252 o Windows-1252 in quanto alcuni caratteri che hai presentato esistono solo in quelle codifiche.

Cerca e ricerca credo di aver capito cosa è successo.

Fra la versione 2.0.8 e la versione 2.0.10 gli sviluppatori Lazarus decidono di trattare le stringhe non più in Codepage ma in UTF8.
Che il modo di memorizzare le stringhe sia cambiato lo si può dedurre da: https://wiki.freepascal.org/String.
Io non cambio spesso la versione di Lazarus perché ad ogni cambio ci sono parecchie cose da risistemare ma ogni tanto si deve fare.
In altri miei progetti avevo inserito un comando del tipo: MySQL50Connection1.CharSet := 'utf8'; fin dalle prime versioni quindi non mi sono accorto di niente anche compilando con un nuovo Lazarus.
In questo vecchio progetto avevo lasciato fare a Lazarus, quindi il programma scriveva e leggeva in CP1252.
I dati che ti ho presentato erano stati scritti col vecchio programma, il nuovo programma assume che siano stati scritti in UTF8 quindi, quando legge, li decodifica con l'algoritmo sbagliato.
Ci sono anche altri che sono rimasti "fregati" da questo cambiamento (che credo giusto anche se doloroso), come si può vedere da: https://forum.lazarus.freepascal.org/index.php/topic,53250.0.html?PHPSESSID=8bn5bmfl99i3s8poqo6ht6dn63.
Non credo sia possibile impostare Lazarus moderno per fargli trattare le stringhe in codepage, per cui col nuovo programma mi andrò a fare una routine di conversione.
Per questa conversione c'è il modo suggerito da @bonmario e un altro nell'ultimo link che ho messo, vedrò di mettere su qualcosa.

Vi faccio sapere,
ciao

DragoRosso

#19
CitazioneYou can fight the Lazarus system and declare your stings as being of a certain codepage and use RawByteString to prevent the compiler form doing unwanted codepage conversion. But in the long run, you better go with the flow.

Questo può essere il tuo cavallo di battaglia....

P.S: da google traduttore  ;D
CitazionePuoi combattere il sistema Lazarus e dichiarare i tuoi sting come appartenenti a una certa codepage e usare RawByteString per impedire al form del compilatore di effettuare conversioni indesiderate di codepage. Ma a lungo termine, è meglio seguire il flusso.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

nomorelogic

quando creo i database in MySql cerco di crearli in utf8.
Poi lancio le seguenti istruzioni da client
 
  FConnection.CreateStatement.Execute('SET NAMES ''utf8''');
  FConnection.CreateStatement.Execute('SET CHARACTER SET ''utf8''');
  FConnection.CreateStatement.Execute('SET character_set_client = ''utf8''');
  FConnection.CreateStatement.Execute('SET character_set_database = ''utf8''');
  FConnection.CreateStatement.Execute('SET collation_connection = ''utf8mb4_unicode_ci''');


in questo link trovi della documentazione
https://dev.mysql.com/doc/refman/8.4/en/set-character-set.html

Spero possa essere utile
Imagination is more important than knowledge (A.Einstein)

DragoRosso

Citazione di: nomorelogic il Novembre 13, 2024, 04:51:47 PM
quando creo i database in MySql cerco di crearli in utf8.

Comunque crei i DB, il risultato dipende da cosa ci metti dentro.
Se il vecchio sw scriveva in ANSI e leggeva in ANSI (ossia senza codifica) i dati nel db sono (dovrebbero essere, non conosco molto MySQL) diciamo in ANSI.

Quando li leggi con il nuovo compilato, lui cerca di leggere un UTF-8 generando quando visto sopra (è una mia ipotesi).

Usando come viene detto dalla wiki di Lazarus il tipo "rawstring" in lettura, ipoteticamente dovrebbero essere riportati i dati in ANSI così come scritti.

Io in passato usavo ANSI (c'erano ancor ai CP), poi quando ho mi sono scontrato con lingue diverse dall'inglese e l'italiano sono passato in UTF-8 e da li in poi non ho mai avuto più problemi. Ti parlo ormai di 15 anni fà, anzi sicuramente di più visto che Delphi non era ancora Unicode (forse era BDS2006 a naso). Da allora ho dimenticato il tutto perchè uso solo UTF-8 per tutto ciò che và in esterno (file di configurazione, scambio dati, DB).
Rimane solo l'ASCII per i dispositivi vecchio stile tipo i seriali. o i dispositivi embedded. Ma li si usano SEMPRE e SOLO caratteri da 0 a 127.

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

tito_livio

#22
Alla fine ho deciso convertire gli archivi per averli in utf8.
Come consigliato da @bonmario utilizzo l'istruzione: nuova_stringa:=UTF8ToWinCP(vecchia_stringa) e poi salvo nuova_stringa nel suo campo del db, ovviamente usando la unit lazutf8.
Poi,da questo momento in poi, il nuovo programma leggerà le stringhe correttamente.
C'è però da fare attenzione ai caratteri inseriti nei vecchi programmi usando alt-xxx, a me è capitato un ≥ che la funzione ha tradotto con un =, per cui, in questi casi ho dovuto fare una traduzione mia personalizzata.
Le vocali accentate, l'€ ed il ° invece vengono tradotte per bene.
Grazie per l'aiuto,
alla prossima

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.