encountered invalid character

ciao!

ho un problema che mi sta facendo uscire pazzo in una webapp!!
faccio import da file csv in db mssqlserver 2008r2 express. l’import va a buon fine.

quando, per devo mostrare i risultati di una query in una listbox, ecco che si presenta l’errore…il problema che non si capisce a quale campo sia riferito…

forse servirebbe un enconding, ma se nel db vedo i dati correttamente, perch la listbox non me li mostra???

grazie, ciao

ciro

Pu capitare che un carattere “strano” che magari non vedi, o che non ha il corretto encoding mandi in errore l’app.

Prova a riempire la listbox una riga alla volta (o prima per gruppi, non so quanti record sono), per trovare il record, poi campo per campo per trovare il campo incriminato.
Guarda poi l’encoding tramite il debugger.

In alternativa, guarda con attenzione il messaggio d’errore, probabilmente hai il testo incriminato anche se magari non perfettamente comprensibile, puoi trovare qualcosa per identificare il record

purtroppo sono + di 2000 record!!! e nel debug vedo tantissimi listboxfield che dovrei andare a caso,
sarebbe stato meglio se la listbox riempiva a mano a mano i record fermandosi su quello con l’errore piuttosto che mostrarli tutti insieme alla fine…

ho provato a filtrare “a monte” (ossia nel programma VFP che crea i files che poi importo con xojo) i caratteri + strani, per ora dovrei averli tolti tutti…

speriamo bene…

ciao!

se hai un ciclo while_wend o qualcosa del genere per importare i dati, a rigo scritto quindi con l’ultimo listbox.cell(numeroriga,numerocolonna) = recordx
windows.refresh o listbox.refresh cos vedi esattamente l’ultimo rigo scritto quando ottieni l’errore.
il record successivo quello incriminato …

Ho importato anche io qualcosa come un miliardo di record da diverse tabelle da VisualFoxPro.
Ciao, Max

grazie a tutti, ho trovato il problema!

ma non c’ un modo in xojo per accettare questi caratteri?
lo fa anche con , che nella lingua italiana sono molto frequenti e non posso trasformarli in e,a,i,o,u…(soprattutto se si tratti di nominativi)

ciro

Quindi errore di codifica. Xojo UTF8. Il tuo db sar.il solito iso 1252…

Cerca qui sul forum la parola chiave utf8 oppure encoding

Non dovrai cos impazzire con i caratteri speciali dell’alfabeto latino. CIAO E BUONA PASQUA

quando carichi dal db i dati prova a salvare i dati in una variabile e fai il break
ad esempio

dim test as string=mioRecordSet("campoIncriminato").stringValue break

Quando si apre il debugger fai click sulla stringa per vederla e guarda che tipo di encoding ha

Se iso… allora puoi semplicemente chiamare un .convertEncoding(encodings.UTF8)
se gi UTF8 allora sono incasinati i dati al momento dell’inserimento

Riguarda la procedura di inserimento, verifica che i dati siano convertiti (se necessario) in utf8 prima di inserirli nel db

ciao Antonio, ho incontrato nuovamente il problema e, seguento il tuo suggerimento, ho verificato che la mia stringa ha encoding Nil

che significa? nello specifico questa la stringa : 1 BTG. PIEMONT

il problema il simbolo del grado.(filtralo a monte come gli altri) oppure metti la giusta codifica nel programma che estrae i dati.
Io ho avuto lo stesso problema su AS400.

Ecco Luciano, sei ancora tra di noi ???

Comunque Ciro, potrebbe essere anche qualsiasi carattere del set esteso, nel tuo caso ‘1° BTG. PIEMONT’
Fai un normale replaceall però occorre trovare quale carattere Hex corrisponde al simbolo incriminato.
quindi replaceall(stringa,&u00B0,“mettiquellochevuoi”)
Probabile tu debba usare &uB0 al posto di &u00B0 in base alla codifica;
Analizzando … arrivando da mssql controlla che il database non sia impostato in UTF16;
Per indentificare bene che carattere è puoi anche usare il debub, e verificare il contenuto della variabile nel formato HEX;

il database di partenza un ERP Zucchetti (Ad Hoc Enterprise nello specifico), purtroppo sono campi alfanumerici quindi possono scriverci quello che vogliono, in passato ho usato un filtro a monte (nell’export da ERP) per pulire, ma i possibili caratteri sono tanti…

c

ok…
serve solo una query per capire come coooooooooooooodificato il database…

usa :

select data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count(*) count from information_schema.columns group by data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name;

le colonne sono data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count

Boh, poi in debug visualizzi il contenuto del recordset …
oppure riempi una listbox
comunque almeno riusciamo a capire che formato ha …

Se l’encoding nil, hai provato in debug se visualizzandolo come utf8 rimane normale o viene “distorto”?

Se non ci sono problemi allora se l’encoding nil puoi usare il defineEncoding

DefineEncoding lo usi quando l’encoding nil e tu ipotizzi, o sai, che encoding deve essere (ad esempio in un socket quando ricevi i dati da un webService che sai che risponde in UTF8)

ConvertEncoding lo usi quando l’encoding non nil ma lo devi trasformare in qualcos’altro.
Ad esempio nel tuo caso magari l’encoding giusto Windows… e lo devi trasformare in UTF8 per coerenza con i dati che stai usando ora.

E’ un formato universale quello del DB di Ad Hoc Enterprise anche perch tale software funziona su quasi tutti i database in commercio compresi quelli open source come postgreesql ; deduco comunque, come altre applicazioni zucchetti che sia codificato in UTF16; per non vorrei sbagliarmi.

Niente, anche con il defineencoding il grado lo segnala come invalid character, mettendo pero cosi

While Not rs.EOF
LstCentriCosto.AddRow(rs.IdxField(1).StringValue.DefineEncoding(encodings.UTF8),rs.IdxField(2).StringValue.DefineEncoding(encodings.UTF8),rs.IdxField(3).StringValue.DefineEncoding(encodings.UTF8),rs.IdxField(4).StringValue.DefineEncoding(encodings.UTF8))
rs.MoveNext
Wend

forse dovrei provare con utf16?

ok
prova con rs.IdxField(xxx).StringValue.defineEncoding(encodings.UTF16).convertEncoding(encodings.UTF8)

Se non funziona ancora fammelo sapere che proviamo un’altra strada.

ho provato antonio…ma adesso mi escono i caratteri cinesi???

ho risolto (pare) mettendo

.defineEncoding(encodings.SystemDefault)

OK bene.
Cerca, confrontandoli, di capire a cosa corrisponde sulla tua macchina SystemDefault

Questo perch non sempre certo che sia uguale (ad esempio tra mac e win)