конфликты: определение строки wchar_t в стандарте C ++ и реализации Windows?

Из 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).

Что-то не так с моим пониманием?

Спасибо.

7
задан Community 23 May 2017 в 11:51
поделиться