Подпись char и Unicode в C ++ 0x - PullRequest
       27

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

10 голосов
/ 06 марта 2010

В рабочем проекте C ++ 0x новые типы символов ( char16_t и char32_t ) для обработки Unicode будут без знака ( uint_least16_t и uint_least32_t будет базовыми типами).

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

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

Обновление : Есть предложение добавить новый тип: char8_t

char8_t: тип для символов и строк UTF-8 (Версия 1) http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2018 / p0482r1.html

Ответы [ 3 ]

3 голосов
/ 06 марта 2010

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

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

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

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

2 голосов
/ 06 марта 2010

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

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

1 голос
/ 08 марта 2011

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

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

В любом случае, пока комитет C ++ 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 определенно не подписаны.

...