Newsgroup: it.comp.programmare.win32
Titolo: Unicode...in c++

Ciao a tutti, 
fin'ora ho programmato in visual studio 2005 in c++, non utilizzando i
caratteri unicode.
Ho provato a scrivere qualche riga di codice con l'opzione di Unicode
e per esempio, le funzioni CString.format e altre, non funzionano più
come prima.
Come si fa??
Grazie.
Ciao
F

 Ciao
Prego ciao
-- 
Raffaele Rialdi  
http://www.iamraf.net
Weblog: 
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET - 
http://www.ugidotnet.org/

 tchar oppure _T("...") la solo wchar_t e L"...".
intendevi "ma solo", vero?
P.S. un wchar_t corrisponde esattamente a cosa? Un carattere unicode UCS 
32 o UCS 16? (nemmeno io ho le idee chiarissime, ehm ^_^)

 UCS 16? (nemmeno io ho le idee chiarissime, ehm ^_^)
È un wide char che al contrario del multibyte ha lunghezza fissa a 16 
bit (almeno per VC++), quindi unicode a 16 bit (ergo UTF-16 che credo 
sia quello che volevi dire tu).
Ciao


Prego ciao
Capisco! (poco)
Cmnq intendevo che 
se metto nelle proprietà del progetto alla voce SET DI CARATTERI
l'opzione usa caratteri UNICODE invece di Multibyte
(e a questo punto non so quello che faccio/ ho fatto)
tipo questa istruzione :
m_Lista_Vetri.InsertColumn(0,"ID",LVCFMT_LEFT,30,0);
mi dà questo errore
Errore	1	error C2664: 'int
CListCtrl::InsertColumn(int,LPCTSTR,int,int,int)': impossibile
convertire il parametro 2 da 'const char [3]' a 'LPCTSTR'	
oppure 
CString tmp;
tmp.Format("SELECT * FROM vetri");
mi da questo errore
Errore	21	error C2664: 'void
ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)':
impossibile convertire il parametro 1 da 'const char [20]' a 'const
wchar_t *'

 wchar_t *'
L'errore è molto chiaro: non puoi convertire const char [20] (cioè la 
tua stringa ansi "SELECT ..." in const wchar_t * che è il tipo unicode 
accettato dalla Format.
Attento che dovrai cambiare tutte le manipolazioni di stringhe:
- non più strcpy ma wcscpy (possibilmente usa le wcscpy_s che sono le 
versioni "safe")
- non più string ma wstring. Parlo delle STL che trovi definendo:
#include <string>
using namespace std;
- e così via per tutte le  manipolazioni di stringhe.


 tmp.Format("SELECT * FROM vetri");
ettecredo. Lui si aspetta una stringa di wchar_t e tu gli dai una 
stringa normale. *Devi* usare la macro L:
m_Lista_Vetri.InsertColumn(0,L"ID",LVCFMT_LEFT,30,0);
tmp.Format(L"SELECT * FROM vetri");
Comunque "m_Lista_Vetri" è un nome noto: tempo fa ho lavorato prima in 
una ditta di infissi in PVC e poi in una vetreria e le "liste vetri" mi 
sono assai familiari :-)
Stai scrivendo un programma CAD/CAM per infissi o per vetrai?


Grazie mille per la spiegazione/soluzione a Raffaele e a Massimo!
L'esempio che ho fatto è relativo a un programma per infissi :). Ma
non è Cad/Cam...però diciamo che ci va vicino.
Quindi, se devo cominciare un programma da 0, mi conviene usare le
Stl, almeno per le stringhe!


Scusate,  ma come lo sostituisco il "format"del CString con la string
STL?

 STL?
Si, decisamente meglio le STL
#include <iostream>
#include <sstream>
using namespace std;
...
wstringstream ss;
int abc = 123;
ss << L"Hello, world " << abc << L" = 0x" << hex << abc;
wcout << ss.str() << endl;
Quando cerchi su internet, cerca le versioni ansi (stringstream, cout, 
etc.) perché la maggior parte di discussioni sono tutte in ansi e non 
sulla controparte in unicode. Tanto cambia solo ansi/unicode ma non il 
modo di usarle.


 STL?
E qui incominciano i dolori... usando le stringhe della STL devi usare 
gli stream, che funzionano in modo sostanzialmente diverso dalle 
funzioni di formattazione delle CString. Dovrai perdere un pò di tempo a 
imparare come funzionano cin, cout e gli operatori sugli stream.
Se non altro, ne guadagnerai in futuro: meno casini di manutenzione, 
meno problemi se mai dovessi portarlo su un altro sistema operativo o se 
dovessi cambiare ambiente di sviluppo.
Però son sempre giorni persi :-|
P.S: non mescolare gli stream e le funzioni di libreria C (strlen, 
strchr, strstr ecc.) perché non sono compatibili e il compilatore se la 
prenderebbe a male. Molto meglio usare solo gli stream.

E qui incominciano i dolori... 
Eh... ho visto!!
Peccato perchè mi ero abituato bene!!
Ma non è che qualcuno ha fatto una funzione che,usando string STL,  fa
quello che fa .format e la vuole condividere????
 :)
Ma posso farvi una domanda, che mi sorge spontanea :
Tutte queste cose, se uno come me volesse andare a "scuola", anche per
imparare il C#, che se lo impari da solo, ok, ma se te lo spiegano è
meglio...
dove si può andare? Ho chiesto una volta a una scuola privata di PD,
mi hanno sparato una cifra da urlo.
volgio dire...ci sono mica gli insegnanti che fanno ripetizioni a
casa?
Grazie
Ciao

 Ciao
Prego, ciao


 Si, decisamente meglio le STL
Raffaele, se hai 2 minuti mi spieghi perché?
Sinceramente le CString da quando non sono più obbligatoriamente legate 
a MFC non mi sembrano poi così male...

 non mi sembrano poi così male...
Ciao, è ovviamente solo una preferenza ...
CString è sicuramente più intuitiva rispetto alle stringhe STL ma 
queste hanno dalla loro l'ampia libreria del resto delle STL.
Per esempio in <algorithm> trovi tantissime funzioni preziose che si 
integrano bene con le string/wstring
http://www.cplusplus.com/reference/algorithm/
http://www.cs.helsinki.fi/u/tpkarkka/alglib/k06/lectures/algorithms.html
Esempio stupidissimo:
 srand(time(NULL));
 wstring test1(L"Hello, world");
 random_shuffle(test1.begin(), test1.end());
 wcout << test1 << endl;
In uscita hai la stringa randomizzata carattere per carattere.
Considerato che si fa presto ad abituarsi a wstring, sinceramente la 
preferisco.
Se poi devi creare codice portabile, ovviamente diventano un must.
