Autore Topic: CASE e lettere accentate  (Letto 1726 volte)

Offline madnessmike

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
    • MadnessBlog
CASE e lettere accentate
« il: 24 Gennaio 2009, 19:14:30 »
Salve a tutti.
Sto realizzando un piccolo programma per tradurre le frasi in Albhed. Per fare tutto ciò mi affido a questa funzione:

Codice: [Seleziona]

' Modulo di traduzione Italiano-Albhed
PUBLIC FUNCTION Traduci(FraseOrigine AS String) AS String
DIM FraseDestinazione AS String
DIM CarattereDaTradurre AS String
DIM i AS Integer
FOR i = 1 TO Len(FraseOrigine)
  CarattereDaTradurre = Mid(FraseOrigine, i, 1)
  SELECT CASE CarattereDaTradurre
    'Lettere Maiuscole
    CASE "A"
      FraseDestinazione &= "Y"
    CASE "B"
      FraseDestinazione &= "P"
    CASE "C"
      FraseDestinazione &= "L"
    CASE "D"
      FraseDestinazione &= "T"
    CASE "E"
      FraseDestinazione &= "A"
    CASE "F"
      FraseDestinazione &= "V"
    CASE "G"
      FraseDestinazione &= "K"
    CASE "H"
      FraseDestinazione &= "R"
    CASE "I"
      FraseDestinazione &= "E"
    CASE "J"
      FraseDestinazione &= "Z"
    CASE "K"
      FraseDestinazione &= "G"
    CASE "L"
      FraseDestinazione &= "M"
    CASE "M"
      FraseDestinazione &= "S"
    CASE "N"
      FraseDestinazione &= "H"
    CASE "O"
      FraseDestinazione &= "U"
    CASE "P"
      FraseDestinazione &= "B"
    CASE "Q"
      FraseDestinazione &= "X"
    CASE "R"
      FraseDestinazione &= "N"
    CASE "S"
      FraseDestinazione &= "C"
    CASE "T"
      FraseDestinazione &= "D"
    CASE "U"
      FraseDestinazione &= "I"
    CASE "V"
      FraseDestinazione &= "J"
    CASE "W"
      FraseDestinazione &= "F"
    CASE "X"
      FraseDestinazione &= "Q"
    CASE "Y"
      FraseDestinazione &= "O"
    CASE "Z"
      FraseDestinazione &= "W"
     'Lettere accentate
    CASE "À"
      FraseDestinazione &= "Ý"
    CASE "È"
      FraseDestinazione &= "À"
    CASE "É"
      FraseDestinazione &= "Á"
    CASE "Ì"
      FraseDestinazione &= "È"
    CASE "Ò"
      FraseDestinazione &= "Ù"
    CASE "Ù"
      FraseDestinazione &= "Ì"
     'Lettere minuscole
    CASE "a"
      FraseDestinazione &= "y"
    CASE "b"
      FraseDestinazione &= "p"
    CASE "c"
      FraseDestinazione &= "l"
    CASE "d"
      FraseDestinazione &= "t"
    CASE "e"
      FraseDestinazione &= "a"
    CASE "f"
      FraseDestinazione &= "v"
    CASE "g"
      FraseDestinazione &= "k"
    CASE "h"
      FraseDestinazione &= "r"
    CASE "i"
      FraseDestinazione &= "e"
    CASE "j"
      FraseDestinazione &= "z"
    CASE "k"
      FraseDestinazione &= "g"
    CASE "l"
      FraseDestinazione &= "m"
    CASE "m"
      FraseDestinazione &= "s"
    CASE "n"
      FraseDestinazione &= "h"
    CASE "o"
      FraseDestinazione &= "u"
    CASE "p"
      FraseDestinazione &= "b"
    CASE "q"
      FraseDestinazione &= "x"
    CASE "r"
      FraseDestinazione &= "n"
    CASE "s"
      FraseDestinazione &= "c"
    CASE "t"
      FraseDestinazione &= "d"
    CASE "u"
      FraseDestinazione &= "i"
    CASE "v"
      FraseDestinazione &= "j"
    CASE "w"
      FraseDestinazione &= "f"
    CASE "x"
      FraseDestinazione &= "q"
    CASE "y"
      FraseDestinazione &= "o"
    CASE "z"
      FraseDestinazione &= "w"
    'Lettere Accentate Minuscole  
    CASE "à"
      FraseDestinazione &= "ý"
    CASE "è"
      FraseDestinazione &= "à"
    CASE "é"
      FraseDestinazione &= "á"
    CASE "ì"
      FraseDestinazione &= "è"
    CASE "ò"
      FraseDestinazione &= "ù"
    CASE "ù"
      FraseDestinazione &= "ì"
    CASE ELSE  
      FraseDestinazione &= CarattereDaTradurre
  END SELECT
NEXT
  RETURN FraseDestinazione
END


Il problema sorge quando tento di "convertire" le lettere accentate: anche se sono inserite nel Case come potete ben vedere, nell'output escono come un case else.
Forse è dovuto al fatto che Gambas (uso la versione 2.5) non accetti le lettere accentate nei Case? :-?

Delucidatemi voi.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: CASE e lettere accentate
« Risposta #1 il: 24 Gennaio 2009, 21:41:48 »
il problema sembra generato da mid , facendo un debug all' uscita di questa funzione il carattere con l' accento viene indicato come due quadrati

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: CASE e lettere accentate
« Risposta #2 il: 24 Gennaio 2009, 21:47:21 »
potresti riscrivere la funzione utilizzando:


CarattereDaTradurre = Asc(FraseOrigine, i)


 e poi i vari case indicando il codice ascii dei vari caratteri

.....

CASE 195                           'codice ascii di à
      FraseDestinazione &= "y"
.........

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: CASE e lettere accentate
« Risposta #3 il: 24 Gennaio 2009, 23:13:33 »
Una mia curiosità personale: a quale tipo di traduzione corrisponde quella che sta effettuando se è possibile sapere? Nel caso non fa niente....

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: CASE e lettere accentate
« Risposta #4 il: 24 Gennaio 2009, 23:39:24 »
Gambas tratta internamente i caratteri con la codifica UTF-8. Devi quindi "tradurre" le lettere accentate in codifica UTF-8 prima di fargliele "digerire".
Leggi un po' qui:
file:///usr/local/share/gambas2/help/tree/index.html
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: CASE e lettere accentate
« Risposta #5 il: 25 Gennaio 2009, 01:37:54 »
Sì. è vero, però l'oggetto String già lo fà di suo, ovvero, all'interno di Gambas tutto viene trattato in UTF-8.
L'unico problema è quando leggi questi caratteri dall'esterno (es. un file); nel qual caso, è necessario usare la funzione Conv() (o equivalenti).

[leo]
il link che hai inserito fà riferimento al tuo pc, ma non tutti hanno installato la doc di Gambas in quella dir.

Offline madnessmike

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
    • MadnessBlog
Re: CASE e lettere accentate
« Risposta #6 il: 25 Gennaio 2009, 11:16:42 »
Citazione

potresti riscrivere la funzione utilizzando:


CarattereDaTradurre = Asc(FraseOrigine, i)

Ho provato, ma funziona in parte, nel senso che quando trova un "à" mi restituisce "ý160"

Citazione
L'unico problema è quando leggi questi caratteri dall'esterno (es. un file); nel qual caso, è necessario usare la funzione Conv() (o equivalenti).

Allora non ne avrei bisogno visto che uso delle TextArea per l'input e l'output.
Da quel che penso io, nel gamberetto non hanno ben considerato l'uso delle lettere accentate... buffo!
Qualche altra idea? Se no, farò a meno delle lettere accentate, tanto non sono così importanti...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: CASE e lettere accentate
« Risposta #7 il: 25 Gennaio 2009, 11:51:15 »
Ci potrebbe essere una soluzione un pò lunga ma potrebbe funzionare...

La tua lettera accentata la riversi in un file di testo e poi usi tale testo per importare la lettera accentata ed usi la funzione conv()...

non so se può funzionare...ma potresti provare!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: CASE e lettere accentate
« Risposta #8 il: 25 Gennaio 2009, 12:44:55 »
La classe String, anche se non documentata, ha dei metodi per il trattamento.
Se hai l'autocompletamento attivo, basta che scrivi "String." e ti compaiono le varie proprietà.
Una di queste è Code(), che funziona come la funzione standard Asc(), solo che tratta proprio i caratteri unicode.

Comunque, se hai di questi problemi, ovvero se tratti caratteri non Ascii, usa solo questa classe, altrimenti ti trovi nei pasticci.

Offline madnessmike

  • Gamberetto
  • *
  • Post: 43
    • Mostra profilo
    • MadnessBlog
Re: CASE e lettere accentate
« Risposta #9 il: 25 Gennaio 2009, 14:28:15 »
Il metodo di md9327 funziona!

Ora ho sistemato il Case Else in
Codice: [Seleziona]
FraseDestinazione &= String.Chr(CarattereDaTradurre)

e anche qui va che è una meraviglia! :-D
Ora devo settare tutti i case con i valori numerici, palloso ma va fatto!

Grazie mille per il vostro preziosissimo aiuto!

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: CASE e lettere accentate
« Risposta #10 il: 25 Gennaio 2009, 15:16:31 »
@md9237:
hai ragione, ho preso il link prima di pensare da dove venisse :-)

Cmq, in quella pagina c'era proprio il riferimento alla classe String ed al metodo Code che poi hai riportato tu ;-)
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: CASE e lettere accentate
« Risposta #11 il: 25 Gennaio 2009, 23:52:40 »
[leo]
Non volevo puntualizzare la cosa, immaginavo fosse una svista...

[MadnessMike]
la classe mica è mia!?! :-)

Scherzo! Il problema l'ho avuto anche io, tempo fà, con pgDesigner e i file xml; in realtà la cosa non ha risolto il problema completamente, tanto è vero che ho dovuto, in alcuni casi, codificare le stringhe.