Я заметил, что метод длины std :: string возвращает длину в байтах, и тот же метод в std :: u16string возвращает количество 2-байтовых последовательностей.
Я также заметил, чтокогда символ или кодовая точка находятся за пределами BMP, длина возвращает 4, а не 2.
Кроме того, escape-последовательность Unicode ограничена \ unnnn, поэтому любая кодовая точка выше U + FFFF не может быть вставленаescape escape.
Другими словами, кажется, что нет поддержки суррогатных пар или кодовых точек вне BMP.
Учитывая это, является принятой или рекомендуемой практикой использованиянестандартная библиотека для работы со строками, которая понимает UTF-8, UTF-16, суррогатные пары и т. д.1012 * Пример:
/*
* 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