Newsgroup: it.comp.programmare
Titolo: Problemi con dati utf 8

Ciao a tutti espongo il mio quesito:
Sono alle prese con dati in formato utf 8 e non riesco a memorizzarli 
correttamente su SQL Server 2008.
Catturo dei dati da internet tramite un'applicazione in vb6.
Alcuni di questi dati sono in formato utf 8.
Già nella cattura è un problema perchè una volta letti questi dati, 
mettendoli su una variabile di tipo string ne perdo le caratteristiche.
A parte il problema della cattura ho anche il problema della 
memorizzazione di questi dati su sql server.
Cerco di memorizzarli in un campo varchar(250) oppure nVarchar(250) ma 
ne perdo le caratteristiche.
Chi mi spiega il perchè ?
Grazie a tutti e buon lavoro.

 Chi mi spiega il perchè ?
Perche' siamo nel 2010 e tu stai usando roba vecchia.
Il tipo stringa di VB6 non gestisce il testo in formato UTF8.
Per quanto riguarda il DB, mi viene facile indovinare che il problema
di interpretazione e modifica del dato UTF8 sia analogo.

 di interpretazione e modifica del dato UTF8 sia analogo.
Non ho capito bene.
Per farti meglio comprendere la cosa ti dico cosa ho fatto:
Ho fatto un update del campo incriminato dove gli ho passato la stringa 
in utf8.
All'update avvenuto il campo contiene una stringa con vari ????? etc.etc.
Tieni presente che la prova l'ho fatta sia nel campo Varchar(250) e sia 
nel campo nVarchar(250).
Ti faccio notare che ho fatto il copia ed incolla della stringa da 
modificare direttamente nella query che poi ho eseguito.

 All'update avvenuto il campo contiene una stringa con vari ????? etc.etc.
Ovvio.
Quello che devi fare è scrivere una funzione che PRIMA traduca i 
caratteri da UTF8 al locale di windows (it_IT per l'italia) e POI li 
scriva nel DB. Se sono solo caratteri "accentati strani" come quelli 
tedeschi o spagnoli è facile, se sono ideogrammi o caratteri arabi, 
allora o il VB6 e il DB hanno il supporto per Unicode (e tu lo attivi e 
lo usi) o sei fregato, credo :-)

sei fregato, credo :-)
Francamente, se il ruolo di VB6 � quello di leggere e trasferire un
dato, non riesco a capire tutto questo parlare di "supporto di UTF8":
in che senso una stringa di VB6 "supporterebbe" meno UTF8 di un array
di caratteri in C o C++? UTF8 o no, a livello di flusso dati, � pur
sempre una sequenza di byte come qualunque altra.
Semmai, il problema del supporto si potrebbe porre riguardo al
protocollo di trasporto. E magari falliranno funzioni stringa di VB6
sulle stringhe UTF8 (anche se mi pare che qualcosa per caratteri
unicode ci sia pure); e, in seguito, ci sar� il problema di far vedere
correttamente all'utente questi dati (che comunque mi sembra pi� una
questione di sistema che di VB6). Ma perch� non dovrebbe andare a buon
fine prendere una sequenza di byte da una parte e metterla da un'altra
parte? tra l'altro, le stringhe di VB6 non sono neppure zeroterminate
come in C.
Parimenti, per quanto riguarda il DB, se il suo compito � solo quello
di memorizzare il dato (una sequenza di byte comunque legittima,
qualunque interpretazione le si possa dare), perch� non dovrebbe
essere in grado di farlo? proprio l'ignoranza di che cosa sia UTF8 mi
pare dovrebbe invece consentirgli di memorizzare il dato come innocua
sequenza di byte (dati binari in campi stringa li memorizzavo gi� in
dbIII). Certo, falliranno ordinamenti, ricerche... tutto quello che
volete, ma � tutta roba che viene dopo. E ancora, davvero SQL Server
2008 non supporta UTF8?
Certo, se fai parlare strumenti che conoscono UTF8 con altri che
conoscono UTF8, tutto (ne sono tranquillamente convinto) va
magicamente a posto. Ma perch� la cosa dovrebbe "ovviamente" fallire
con VB6? e fallire in un punto che non ha nulla a che fare con
l'interpretazione UTF8 del dato?
Ciao.

 
Innanzitutto dovresti leggere un tutorial su Unicode.
In seguito verificare come gestire l'encoding da VB6, e, soprattutto, su 
SQL Server.
Non conosco SQL Server, ma PostgreSQL, ad esempio, ti permette di 
scegliere l'encoding da utilizzare per le stringhe in fase di creazione 
del database.
Inoltre puoi impostare l'encoding durante ciascuna sessione, in questo 
modo puoi fare:
  -- encoding utilizzato dal testo che si sta per inserire
  SET CLIENT_ENCODING = 'UTF8'
  INSERT ...
in questo modo il transcoding viene fatto da PostgreSQL, purchè, 
ovviamente, supporti l'encoding che stai utilizzando.
Se il tuo linguaggio di programmazione supporta Unicode, questo può 
essere fatto lato client, ed è *molto* meglio, dato che non rischi di 
ritrovarti il database pieno di spazzatura.
Ciao  Manlio

 modificare direttamente nella query che poi ho eseguito.
Ok. In questo caso devo supporre che il dato sia stato scritto 
correttamente nel DB.
Per visualizzarlo come fai?