Я заметил, что метод длины std::string возвращает длину в байтах, а тот же метод в std:: u16string возвращает число двухбайтовых последовательностей.
Я также заметил, что когда символ или кодовая точка находится за пределами BMP, длина возвращает 4, а не 2.
Кроме того, escape-последовательность Unicode ограничена \unwnn, поэтому любая кодовая точка выше U + FFFF не может быть вставлена управляющей последовательностью.
Другими словами, не существует поддержки суррогатных пар или кодовых точек вне BMP.
Учитывая это, является ли принятая или рекомендуемая практика использовать нестандартную библиотеку манипуляции строками, которая понимает UTF-8, UTF-16, суррогатные пары и т.д.?
У моего компилятора есть ошибка, или я неправильно использую стандартные методы обработки строк?
Пример:
/*
* Example with the Unicode code points U+0041, U+4061, U+10196 and U+10197
*/
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string example1 = u8"A䁡𐆖𐆗";
std::u16string example2 = u"A䁡𐆖𐆗";
std::cout << "Escape Example: " << "\u0041\u4061\u10196\u10197" << "\n";
std::cout << "Example: " << example1 << "\n";
std::cout << "std::string Example length: " << example1.length() << "\n";
std::cout << "std::u16string Example length: " << example2.length() << "\n";
return 0;
}
Вот результат, который я получаю при компиляции с помощью GCC 4.7:
Escape Example: A䁡မ6မ7
Example: A䁡𐆖𐆗
std::string Example length: 12
std::u16string Example length: 6