View Full Version : [C++] string, utf-8, accenti, lunghezze..
Ciao,
sto sbattendo la testa contro un muro :muro: In particolare, leggo che il tipo std::string può lavorare in UTF-8 (è così?), mentre il wstring è per formati ancora più "larghi" (UTF-16 e UTF-32).
Ma allora perchè:
std::string test="qualità";
cout << test.length() << endl;
dà come risultato
8
Lo stesso codice, utilizzando wstring, funziona correttamente (7) ma preferirei, se posso, usare il tipo string per poter mantenere la compatibilità con le altre classi e per ottimizzazione.
Sapete aiutarmi?
Grana
il-pollo
16-02-2010, 13:16
usando Visual Studio 2008 ottengo il risultato corretto nella versione con std::string
:mbe: strano sto problema
usando Visual Studio 2008 ottengo il risultato corretto nella versione con std::string
:mbe: strano sto problema
Sono sotto linux, e sospetto che abbia a che fare con i locale, ma anche con
std::locale::global(std::locale("it_IT.utf8"));
non cambia niente
Ciao,
sto sbattendo la testa contro un muro :muro: In particolare, leggo che il tipo std::string può lavorare in UTF-8 (è così?), mentre il wstring è per formati ancora più "larghi" (UTF-16 e UTF-32).
Ma allora perchè:
std::string test="qualità";
cout << test.length() << endl;
dà come risultato
8
Lo stesso codice, utilizzando wstring, funziona correttamente (7) ma preferirei, se posso, usare il tipo string per poter mantenere la compatibilità con le altre classi e per ottimizzazione.
Sapete aiutarmi?
Grana
Puoi utilizzare std::string per contenere una stringa codificata in UTF-8, bisto che quest'ultima non e' altro che una sequenza di singoli byte,ma il risultato non e' quello che ti aspetti. Una volta che si va oltre i caratteri ASCII infatti i caratteri cominciano ad usare piu' di un byte e non c'e' piu' corrispondenza tra la tabella caratteri usata per la lettura delle stringhe (dipendente tipicamente dal locale utilizzato) e la tabella UTF-8.
Devi cercarti delle funzioni accessorie che facciano l'opportuna conversione delle stringhe in formato UTF-8 e viceversa.
In particolare, se non ricordo male, le stringhe letterali nel sorgente vengono interpretate secondo il set di caratteri utilizzato dal compilatore.
Ma allora perchè:
std::string test="qualità";
cout << test.length() << endl;
dà come risultato
8
Come puoi vedere qui:
http://www.utf8-chartable.de/unicode-utf8-table.pl?start=0
La codifica UTF-8 della à occupa due byte, il che potrebbe spiegare la lunghezza maggiorata.
mi sembra assurdo (intendo l'implementazione, non la tua risposta che sicuramente è corretta), ma grazie (anche se non mi spiego perchè in visual studio il risultato sia corretto).
Possibile che non ci sia un metodo "charlen", o qualcosa del genere?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.