Для функций регулярного выражения / замены / поиска я ранее использовал PCRE.Это предназначено для работы со строками UTF-8.Вы могли бы работать с регулярными выражениями STL, но никак не переносимым способом.(В частности, Windows не поддерживает локали UTF-8.)
Итерация по строке UTF-8 еще сложнее, чем вы описываете, если вам нужно поддерживать объединение меток или объединение нулевой ширины!Вы пишете, что é
- это один символ, но это могут быть две кодовые точки Unicode: латинская строчная буква e +, сочетающая острый акцент выше.Если вы просто хотите перебрать кодовые точки, вы можете использовать mbtowc()
или std::codecvt::do_in
из стандартной библиотеки.Если вам нужно перебирать графемы, самый переносимый способ сделать это - ICU.
Должна работать регулярная конкатенация строк, и стандартная библиотека имеет длину mblen()
.Это не полностью переносимо, потому что многобайтовое кодирование не обязательно должно быть UTF-8 (хотя есть стандартный набор функций преобразования).