2012-09-03 9 views
10

Sono felice di vedere lo std::u16string e std::u32string in C++ 11, ma mi chiedo perché non c'è std::u8string per gestire il caso UTF-8. Ho l'impressione che lo std::string sia destinato a UTF-8, ma non sembra farlo molto bene. Ciò che intendo è, non std::string.length() restituisce ancora la dimensione del buffer della stringa anziché il numero di caratteri nella stringa?std :: u16string, std :: u32string, std :: string, length(), size(), codepoints e caratteri

Quindi, come è il metodo delle corde standard di length() definiti per i nuovi C++ 11 classi? Restituiscono la dimensione del buffer della stringa, il numero di codepoints o il numero di caratteri (supponendo che una coppia surrogata sia 2 punti codice, ma un carattere. Per favore correggimi se ho torto)?

E che dire di size(); non è uguale a length()? Vedere http://en.cppreference.com/w/cpp/string/basic_string/length per la fonte della mia confusione.

Quindi, credo, la mia domanda fondamentale è come si fa uso std::string, std::u16string e std::u32string e adeguatamente distinguere tra dimensione del buffer, il numero di codepoints, e il numero di caratteri? Se si utilizzano gli iteratori standard, si sta iterando su byte, codepoint o caratteri?

+3

'std :: string' funziona anche per utf8 come' u16string' fa per utf16: gestisce gli elementi del tipo corrispondente e non tratta i caratteri rappresentati da una sequenza di più di un elemento. –

+0

Vai qui: http://utf8everywhere.org/#myth.strlen –

risposta

15

u16string e u32string non sono "nuove classi C++ 11". Sono solo typedef di std::basic_string per i tipi char16_t e cha32_t.

length è sempre uguale a size per qualsiasi basic_string. È il numero di T nella stringa, dove T è il tipo di modello per basic_string.

basic_string non è a conoscenza Unicode in qualsiasi modo, forma o forma. Non ha alcun concetto di codepoint, grafemi, caratteri Unicode, normalizzazione Unicode o qualcosa del genere. È semplicemente una sequenza ordinata di T s. L'unica cosa che è a conoscenza di Unicode su u16string e u32string è che usano il tipo restituito dai letterali u"" e U"". Pertanto, possono memorizzare stringhe con codifica Unicode, ma non fanno nulla che richieda la conoscenza di detta codifica.

Iteratori iterano su elementi di T, non "byte, codepoint o caratteri". Se T è char16_t, allora itererà su char16_t s. Se la stringa è codificata in UTF-16, iterating su unità di codice UTF-16, non codepoints o byte Unicode.

+4

Nella terminologia Unicode, 'T' =" codice unità ". – dan04

+1

E * codice unità *! = * Codice punto *. Sono due concetti diversi. Solo per riferimento futuro, perché non sapevo che ... – Eonil

1

Tutti i tipi stringa fanno la stessa cosa: sono titolari di una sequenza di elementi, ciascuno di cui tipo è il tipo di carattere per la stringa. length() e size() restituiscono entrambi il numero di elementi. Iteratore iteratore su elementi. Analisi di livello superiore, come la determinazione del numero di caratteri, richiedono calcoli molto più complessi.

0

Attualmente non esiste nulla nello standard per distinguere tra unità di codice, codepoint o byte individuali. Tuttavia, sembra che ci siano alcune cose in lavorazione per occuparsi di this sort of thing. A seconda di ciò che decide il comitato degli standard, può far parte del TR2 o dello standard successivo.

Problemi correlati