Из c ++ 2003 2. 13
Широкий строковый литерал имеет тип « массив из n const wchar_t » и имеет статическую продолжительность хранения, где n - размер строки, как определено ниже.
Размер широкого строкового литерала - общее количество управляющих последовательностей, универсальных имен-символов и других символов плюс один для завершающего L '\ 0'.
Начиная с c ++ 0x 2.14.5
Широкий строковый литерал имеет тип « массив n const wchar_t ”, где n - размер строки, как определено ниже.
Размер литерала char32_t или широкой строки - это общее количество escape-последовательностей, универсальных имен-символов, и другие символы, плюс один для завершающего U '\ 0' или L '\ 0'.
Размер строкового литерала char16_t - это общее количество управляющих последовательностей, универсальных имен-символов и других символов, плюс один для каждого символа, требующего суррогатной пары, плюс один для завершающего u '\ 0'.
Заявление в C ++ 2003 довольно расплывчато. Но в C ++ 0x при подсчете длины строки широкий строковый литерал wchar_t должен рассматриваться так же, как char32_t, и отличаться от char16_t.
Есть сообщение, в котором четко указано, как Windows реализует wchar_t в https://stackoverflow.com/questions/402283?tab=votes%23tab-top
Короче говоря, wchar_t в Windows составляет 16 бит и кодируется с использованием UTF-16. Заявление в стандарте явно оставляет в Windows что-то противоречивое.
например,
wchar_t kk[] = L"\U000E0005";
Это превышает 16 бит, а для UTF-16 требуется два 16 бит для его кодирования (суррогатная пара).
Однако по стандарту kk представляет собой массив из 2 wchar_t (1 для универсальное имя \ U000E005, 1 вместо \ 0).
Но во внутренней памяти Windows нужно 3 16-битных объекта wchar_t для его хранения, 2 wchar_t для суррогатной пары и 1 wchar_t для \ 0. Следовательно, из определения массива kk - это массив из 3 wchar_t.
Очевидно, они противоречат друг другу.
Я думаю, что одним из самых простых решений для Windows является «запрет» всего, что требует суррогатной пары в wchar_t («запретить») любой юникод за пределами BMP).
Что-то не так с моим пониманием?
Спасибо.