Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Wolfenstein - Aprile 20, 2015, 12:49:41 pm

Titolo: Come visualizzare i caratteri accentati
Inserito da: Wolfenstein - Aprile 20, 2015, 12:49:41 pm
Ciao a tutti,

se eseguo del codice in modalità Consolle e voglio mostrare a video i nostri caratteri accentati ( tipo è, à, ì ecc... ) questi non appaiono, ed al loro posto vengono visualizzati dei simboli strani. Penso che sia dovuto all'UNICODE, però non so come risolvere questa anomalia.
Di seguito incollo un piccolo esempio:

Codice: [Seleziona]
program Test;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

begin
  Writeln('Questo è Free Pascal e Lazarus');
  Writeln('Premi il tasto enter per chiudere');
  Readln;
end.

Qualcuno mi sa dire cosa devo fare ?
Grazie.

Wolfenstein
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: Legolas - Aprile 20, 2015, 02:22:46 pm
Aggiungi una chiamata a SetConsoleOutputCP:

Codice: [Seleziona]
program Test;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, windows
  { you can add units after this };   
begin
  setconsoleoutputcp(65001);
  Writeln('Questo è Free Pascal e Lazarus');
  Writeln('Premi il tasto enter per chiudere');
  Readln;
end.

L'unico problema è che si tratta di una funzione di windows. Per le altre piattaforme non saprei :/
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: nomorelogic - Aprile 20, 2015, 03:29:41 pm
ho provato sotto linux x64 e l'accento viene mostrato correttamente

Edit:
Forse potresti modificare il sorgente proponendolo (segnalando magari che è un tuo adattamento dovuto al fatto che in Italia ci sono le lettere accentate) come segue.

Forse così si complica un po' il codice e bisogna aggiungere anche qualche spiegazione ma, dopotutto, è una guida per imparare a programmare agli italiani...

Codice: [Seleziona]
program Test;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  {$IFDEF WINDOWS}
  windows,
  {$ENDIF}
  Classes
  { you can add units after this };
begin
  {$IFDEF WINDOWS}
  setconsoleoutputcp(65001);
  {$ENDIF}
  Writeln('Questo è Free Pascal e Lazarus');
  Writeln('Premi il tasto enter per chiudere');
  Readln;
end.
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: Wolfenstein - Aprile 20, 2015, 05:05:01 pm
Grazie a te ed a Legolas,

sotto Linux non l'ho testato in quanto da parecchi anni ormai lavoro praticamente solo sotto Windows; dato che si tratta di una specifica espressamente "italiana", inserita in un contesto di traduzione in italiano, penso che possa bastare una nota iniziale di spiegazione per giustificare le modifiche apportate ai sorgenti.
Tra l'altro non ha nessun impatto "pratico" sul codice "esecutivo".

Wolfenstein
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: nomorelogic - Aprile 20, 2015, 05:28:59 pm
sotto Linux non l'ho testato in quanto da parecchi anni ormai lavoro praticamente solo sotto Windows;

ok, tieni comunque in considerazione che la tua traduzione potrebbe essere letta anche da chi usa linux ;)
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: Jor11 - Maggio 16, 2015, 07:58:39 am
Ciao wolfenstein, potresti anche usare i caratteri ascii. Ti riporto un piiccolo esempio:
program esempio;
begin
writeln(chr(138));{scrive è}
end.
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: Wolfenstein - Maggio 24, 2015, 12:16:42 pm
Ciao a tutti,
Dopo aver fatto diversi tentativi mi trovo ancora al punto di partenza; non capisco se sono io che sto sbagliando o meno.
Usando la Funzione SetConsoleOutputCP alla quale ho provato ad assegnare sia il valore 65001 che il valore 850 continuo ad ottenere sempre il solito output errato.
Lo stesso se aggiungo prima della chiamata a SetConsoleOutputCP la chiamata alla funzione SetConsoleCP .
Leggendo le specifiche della funzione SetConsoleOutputCP su MSDN di Microsoft ho trovato questa nota:
"However, if the current font is a raster font, SetConsoleOutputCP does not affect how extended characters are displayed".
Forse è questo che rende ininfluente l'azione di SetConsoleOutputCP ?
Io lavoro sotto Windows 8.1 a 64Bit ed uso Lazarus 1.2.6.
Ho provato quindi ad inserire direttamente la chiamata ad un carattere della tabella ASCII come suggerito da igor e la cosa funziona; infatti l'istruzione:
Writeln('Questo '+ chr(138) +' Free Pascal e Lazarus');
mi restituisce la stringa di testo "Questo è Free Pascal e Lazarus" correttamente.
Pensate che sia il caso di usare questo metodo per la visualizzazione corretta dei caratteri accentati ?

Grazie.
Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: nomorelogic - Maggio 24, 2015, 04:26:48 pm
internamente, in memoria, la stringa è rappresentata bene ma sembra che il font della console non sia in grado di visualizzare i caratteri utf8.

prova a dare un'occhiata a questo thread
http://forum.lazarus.freepascal.org/index.php?topic=13949.0 (http://forum.lazarus.freepascal.org/index.php?topic=13949.0)

fai anche delle prove con Writeln(Utf8ToConsole('àéìòù'));

Titolo: Re:Come visualizzare i caratteri accentati
Inserito da: Wolfenstein - Maggio 24, 2015, 07:34:58 pm
Niente da fare.
Tra l'altro, UTF8ToConsole richiede la Unit FileUtil che non sembra essere presente nel mio PC.
Ho provato a ricostruire Lazarus senza ottenere nulla.
Ho disinstallato Lazarus, cancellato le varie directory e lo ho reinstallato usando l'ultima versione (1.4.0) ma niente da fare.
Comincio a scoraggiarmi.