Visual Studio C ++, поддерживает:
Строки:
string
: тип, описывающий специализацию класса шаблона basic_string
с элементами типаchar
u16string
: тип, описывающий специализацию шаблона класса basic_string
с элементами типа char16_t
. u32string
: тип, описывающий специализациюкласса шаблона basic_string
с элементами типа char32_t
. wstring
: тип, описывающий специализацию класса шаблона basic_string
с элементами типа wchar_t
.
https://docs.microsoft.com/en-us/cpp/standard-library/string-typedefs?view=vs-2019
Литералы символов
- Обычные литералы типа
char
, например 'a'
- UTF-8 символьных литералов типа
char
, например u8'a'
- Широкие символьные литералы типа
wchar_t
, например L'a'
- UTF-16 символьные литералы типа
char16_t
, например u'a'
- UTF-32 символьных литералов типа
char32_t
, например U'a'
https://docs.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=vs-2019#character-literals
Кодировка:
Символьный литерал без префикса является обычным символьным литералом.Значение обычного символьного литерала, содержащего один символ, escape-последовательность или универсальное имя символа, которое может быть представлено в наборе символов выполнения, имеет значение, равное числовому значению его кодировки в наборе символов выполнения.Обычный символьный литерал, который содержит более одного символа, escape-последовательность или универсальное имя символа, является литералом из нескольких символов.Литерал из нескольких символов или обычный символьный литерал, который не может быть представлен в наборе символов выполнения, поддерживается условно, имеет тип int и его значение определяется реализацией.
Символлитерал, который начинается с префикса L, является литералом широкого символа.Значение литерала широких символов, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное числовому значению его кодировки в наборе широких символов выполнения, если символьный литерал не имеет представления в широкоформатном исполнении.набор символов, в этом случае значение определяется реализацией.Значение литерала широких символов, содержащего несколько символов, escape-последовательности или имена универсальных символов, определяется реализацией.
Символьный литерал, который начинается с префикса u8, представляет собой UTF-8буквальный характер.Значение символьного литерала UTF-8, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено одной кодовой единицей UTF-8 (соответствующей C0Блок управления и базовый латинский Unicode блок).Если значение не может быть представлено одной кодовой единицей UTF-8, программа некорректна.Символьный литерал UTF-8, содержащий более одного символа, escape-последовательность или универсальное имя символа, имеет неправильную форму.
Символьный литерал, который начинается с префикса u, представляет собой UTF-16буквальный характер.Значение символьного литерала UTF-16, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено одной единицей кода UTF-16 (соответствующеймногоязычная плоскость).Если значение не может быть представлено одной кодовой единицей UTF-16, программа некорректна.Символьный литерал UTF-16, содержащий более одного символа, escape-последовательность или универсальное имя символа, имеет неправильный формат.
- Символьный литерал, который начинается с префикса U, является символьным литералом UTF-32.Значение символьного литерала UTF-32, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646.Символьный литерал UTF-8, содержащий более одного символа, escape-последовательность или универсальное имя символа, имеет неправильную форму.
https://docs.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=vs-2019#encoding
#include <string>
using namespace std::string_literals; // enables s-suffix for std::string literals
int main()
{
// Character literals
auto c0 = 'A'; // char
auto c1 = u8'A'; // char
auto c2 = L'A'; // wchar_t
auto c3 = u'A'; // char16_t
auto c4 = U'A'; // char32_t
// String literals
auto s0 = "hello"; // const char*
auto s1 = u8"hello"; // const char*, encoded as UTF-8
auto s2 = L"hello"; // const wchar_t*
auto s3 = u"hello"; // const char16_t*, encoded as UTF-16
auto s4 = U"hello"; // const char32_t*, encoded as UTF-32
// Raw string literals containing unescaped \ and "
auto R0 = R"("Hello \ world")"; // const char*
auto R1 = u8R"("Hello \ world")"; // const char*, encoded as UTF-8
auto R2 = LR"("Hello \ world")"; // const wchar_t*
auto R3 = uR"("Hello \ world")"; // const char16_t*, encoded as UTF-16
auto R4 = UR"("Hello \ world")"; // const char32_t*, encoded as UTF-32
// Combining string literals with standard s-suffix
auto S0 = "hello"s; // std::string
auto S1 = u8"hello"s; // std::string
auto S2 = L"hello"s; // std::wstring
auto S3 = u"hello"s; // std::u16string
auto S4 = U"hello"s; // std::u32string
// Combining raw string literals with standard s-suffix
auto S5 = R"("Hello \ world")"s; // std::string from a raw const char*
auto S6 = u8R"("Hello \ world")"s; // std::string from a raw const char*, encoded as UTF-8
auto S7 = LR"("Hello \ world")"s; // std::wstring from a raw const wchar_t*
auto S8 = uR"("Hello \ world")"s; // std::u16string from a raw const char16_t*, encoded as UTF-16
auto S9 = UR"("Hello \ world")"s; // std::u32string from a raw const char32_t*, encoded as UTF-32
}