Подпись char и Unicode в С++ 0x

Из рабочего проекта С++ 0x новые типы char (char16_t и char32_t) для обработки Юникода будут неподписанными ( uint_least16_t и uint_least32_t будут основными типами).

Но насколько я могу видеть (не очень далеко), тип char8_t (на основе uint_least8_t) не определен. Зачем?

И это еще более запутанно, когда вы видите, что для строкового литерала UTF-8 введен новый префикс кодировки u8... на основе старого друга (знак/без знака) char. Почему?

Обновить: Там предлагается добавить новый тип: char8_t

char8_t: Тип для символов и строк UTF-8 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0482r0.html

Ответ 1

char16_t и char32_t должны использоваться для представления кодовых точек. Поскольку нет отрицательных кодовых точек, разумно, чтобы они были без знака.

UTF-8 не представляет собой кодовые точки напрямую, поэтому не имеет значения, подписан ли u8 базовый тип или нет.

Ответ 2

char будет типом, используемым для UTF-8, поскольку он переопределен, чтобы быть уверенным, что он может быть использован с ним:

В целях повышения поддержки для Unicode в компиляторах на С++, определение типа char было модифицированы так, чтобы быть как минимум размером необходимо сохранить восьмибитное кодирование UTF-8 и достаточно большой, чтобы содержать любой член основного компилятора исполнение набора символов. это было ранее определенный как только последний. Существует три кодировки Unicode, которые С++ 0x будет поддерживать: UTF-8, UTF-16 и UTF-32. В дополнение к ранее отметили изменения в определении char, С++ 0x добавит два новых символа types: char16_t и char32_t. Эти предназначены для хранения UTF-16 и UTF-32 соответственно.

Источник: http://en.wikipedia.org/wiki/C%2B%2B0x

Большинство приложений UTF-8 используют char уже в любом случае на ПК/Mac.

Ответ 3

Проект С++ 0x, похоже, не указывает, подписаны или не подписаны новые типы символов Unicode. Однако, как уже отмечалось другими, поскольку нет отрицательных кодовых точек Unicode, для char16_t и char32_t было бы более беззнаковым. (Опять же, было бы разумно, чтобы char был неподписанным, но мы имеем дело с "отрицательными" символами с 70-х годов.)

Кроме того, поскольку UTF-16 находится в диапазоне от 0x0 до 0xFFFF (игнорируя суррогатные пары), для правильного представления всех значений вам понадобится весь диапазон 16-разрядного целого числа без знака. Было бы неудобно, если сказать, если код 0x8000 через 0xFFFF был представлен как отрицательные числа с char16_t.

В любом случае, пока комитет С++ 0x не говорит о чем-то окончательном в этом вопросе, вы всегда можете просто проверить свою реализацию:

#include <type_traits>
#include <iostream>

int main()
{
    std::cout << std::boolalpha << std::is_signed<char16_t>::value << std::endl;
}

Это выводит false с помощью GCC 4.45 в Linux. Таким образом, на одной платформе, по крайней мере, новые типы Unicode определенно неподписанны.