Старайтесь не перепутать кодовую точку Unicode и ее представление в конкретной кодировке. Все Кодовые точки Unicode находятся в диапазоне 0x0
- 0x10FFFF
, что делает их непосредственно сохраняемыми как 32-разрядные числа (это то, что делает UTF-32).
UTF-8 может достигать 6 байт на кодовую точку [править: в действительности это 4 в окончательной версии, поэтому проблема с пространством спорна, но остальная часть параграфа остается в силе], потому что для управления ее переменной длиной требуются некоторые издержки - эточто позволяет кодировать множество других кодовых точек только в 1 или 2 байта. Но когда вы получаете 6-байтовый символ UTF-8 и хотите сохранить его в 32-битном wchar_t
Linux, вы не сохраняете его как есть: вы преобразовать его в UTF-32, отбрасывая накладные расходы. Та же история с 16-битным Windows wchar_t
, за исключением того, что вы можете получить 2 16-битные половины в кодировке UTF-16.
Примечание: многие программы Windows на самом деле используют UCS-2, которыйпо сути UTF-16 без переменной длины. Они не смогут обрабатывать символы, для которых потребовалось бы два UTF-16 wchar_t
.