ho found questo codice e sto per provarlo.
std::string utf8_substr(const std::string& str, unsigned int start, unsigned int leng)
{
if (leng==0) { return ""; }
unsigned int c, i, ix, q, min=std::string::npos, max=std::string::npos;
for (q=0, i=0, ix=str.length(); i < ix; i++, q++)
{
if (q==start){ min=i; }
if (q<=start+leng || leng==std::string::npos){ max=i; }
c = (unsigned char) str[i];
if (
//c>=0 &&
c<=127) i+=0;
else if ((c & 0xE0) == 0xC0) i+=1;
else if ((c & 0xF0) == 0xE0) i+=2;
else if ((c & 0xF8) == 0xF0) i+=3;
//else if (($c & 0xFC) == 0xF8) i+=4; // 111110bb //byte 5, unnecessary in 4 byte UTF-8
//else if (($c & 0xFE) == 0xFC) i+=5; // 1111110b //byte 6, unnecessary in 4 byte UTF-8
else return "";//invalid utf8
}
if (q<=start+leng || leng==std::string::npos){ max=i; }
if (min==std::string::npos || max==std::string::npos) { return ""; }
return str.substr(min,max);
}
Aggiornamento: Questo ha funzionato bene per il mio problema attuale. Ho dovuto mescolarlo con una funzione get-length-of-utf8encoded-stdsstring.
Questa soluzione ha avuto alcuni avvertimenti sputarono a esso dal mio compilatore:

Il problema è che UTF-8 è una codifica a lunghezza variabile ogni carattere può contenere da uno a sei byte. Mentre è possibile usare 'std :: string' per memorizzare le stringhe UTF-8, non è possibile utilizzare direttamente le funzioni standard. È possibile * utilizzare * la funzione 'substr', ma è necessario utilizzare un codice speciale per trovare l'inizio e la fine effettivi della sottostringa. A meno che tu non sia preoccupato per lo spazio, potresti voler archiviare le stringhe internamente in una codifica a lunghezza fissa, come UTF-32. –
Come [questo] (http://stackoverflow.com/questions/17103925/how-well-is-unicode-supported-in-c11) link dice: "Unicode non è supportato dalla libreria standard (per ogni ragionevole significato di supportato std :: string non è migliore di std :: vector: è completamente ignaro di Unicode (o di qualsiasi altra rappresentazione/codifica) e tratta semplicemente il suo contenuto come un blob di byte. " –
paulsm4
Anche con UTF-32, è possibile escludere involontariamente la combinazione di caratteri (ad es. Accenti). Se proprio ne hai bisogno, prenderei in considerazione ICU (http://site.icu-project.org) o qualche libreria simile su misura per gestire Unicode in tutta la sua gloria. –