Mam świadomość, że istnieją różne pytania dotyczące utf-8, głównie o bibliotekach do manipulowania utf-8 'string' jak obiekty.Utf-8 in C++: szybkie i brudne sztuczki
Pracuję jednak nad projektem "umiędzynarodowionym" (strona internetowa, z której koduję backend C++ ... nie pytam), nawet jeśli mamy do czynienia z utf-8, nie potrzebujemy tego tak naprawdę biblioteki. W większości przypadków zwykłe algorytmy std :: string lub algorytmy STL są bardzo wystarczające dla naszych potrzeb, i rzeczywiście jest to celem zastosowania utf-8 w pierwszej kolejności.
Więc, co szukam tutaj jest kapitalizacja „Szybkie & Dirty” sztuczek, które znasz związane z UTF-8 przechowywane jako std :: string (bez const char *, nie wiem Dbaj o kod w stylu c naprawdę mam lepsze rzeczy do roboty niż ciągłe martwienie się o mój rozmiar bufora).
Na przykład o to „Quick & Dirty” podstęp, aby uzyskać liczbę znaków (co jest przydatne wiedzieć, czy będzie pasować w polu wyświetlacza):
#include <string>
#include <algorithm>
// Let's remember than in utf-8 encoding, a character may be
// 1 byte: '0.......'
// 2 bytes: '110.....' '10......'
// 3 bytes: '1110....' '10......' '10......'
// 4 bytes: '11110...' '10......' '10......' '10......'
// Therefore '10......' is not the beginning of a character ;)
const unsigned char mask = 0xC0;
const unsigned char notUtf8Begin = 0x80;
struct Utf8Begin
{
bool operator(char c) const { return (c & mask) != notUtf8Begin; }
};
// Let's count
size_t countUtf8Characters(const std::string& s)
{
return std::count_if(s.begin(), s.end(), Utf8Begin());
}
W rzeczywistości jeszcze się spotkać USECASE kiedy muszę coś innego niż liczba znaków oraz że std :: string lub algorytmów STL nie ofertę za darmo od:
- prac sortowania zgodnie z oczekiwaniami
- żadna część słowa może być mylony jako słowo lub część innego wyrazu
Chciałbym wiedzieć, czy masz inne porównywalne sztuczek, zarówno do liczenia i innych prostych zadań.
Powtarzam, wiem o ICU i Utf8-CPP, ale nie jestem nimi zainteresowany, ponieważ nie potrzebuję pełnowartościowego leczenia (a właściwie nigdy nie potrzebowałem więcej niż liczba znaków).
Powtarzam również, że nie jestem zainteresowany traktowaniem char *, są one staromodne.
Łączenie znaków diakrytycznych nie ma dla ciebie znaczenia? To smutne. Mogą to być postacie według twojego hrabstwa, ale nie zajmują więcej miejsca. Jakakolwiek łącząca się postać. Lub przestrzenie o zerowej szerokości. A sortowanie działa zgodnie z oczekiwaniami? Czego oczekujesz? Jak każdy sortowanie specyficzne dla regionu będzie wiedzieć o sortowaniu, gdy celowo nie użyjesz Unicode (z wyjątkiem pewnego rodzaju tablicy bajtów). – Joey
Zobacz moją edycję, moja aplikacja jest backendem dla strony internetowej, dlatego ustawienia regionalne są w zasięgu przeglądarki. Nigdy nie natknęliśmy się jeszcze na problem łączenia bohaterów, słyszałem o nich, ale nigdy ich nie widziałem, w jakich językach je spotykasz? –
Kilka przypadków użycia, które nie działają dla tekstu w języku innym niż angielski: sortowanie, składanie i dopasowywanie (na przykład niemiecki ß i ss). –