Spec-Zone.ru › C++

std::ctype<CharT>::narrow, do_narrow

Определено в заголовке <locale>
public:
char narrow( CharT c, char dflt ) const;
(1)
public:
const CharT* narrow( const CharT* beg, const CharT* end, 
                     char dflt, char* dst ) const;
(2)
protected:
virtual char do_narrow( CharT c, char dflt ) const;
(3)
protected:
virtual const CharT* do_narrow( const CharT* beg, const CharT* end, 
                                char dflt, char* dst ) const;
(4)
1,2) Публичный член-функция, вызывает соответствующую защищенную виртуальную член-функцию do_narrow перегрузку самого производного класса. Перегрузка (1) вызывает do_narrow(c, dflt), перегрузка (2) вызывает do_narrow(beg, end, dflt, dst).
3) Преобразует (возможно, широкий) символ c в многобайтовую кодировку, если символ может быть представлен одним байтом (например, символы ASCII в кодировке UTF-8 являются однобайтовыми). Возвращает dflt если такого преобразования не существует.
4) Для каждого символа в массиве символов [beg, end), записывает суженные символы (или dflt в случае неудачного сужения) в последовательные места в массиве символов, на который указывает dst.

Сужение всегда успешно и всегда обратимо (с помощью вызова widen()) для всех символов из базового набора символов исходного текста(до C++23)базового набора символов(с C++23).

  • т.е. do_widen(do_narrow(c, 0)) == c всегда выполняется для любого символа c в базовом наборе символов исходного текста(до C++23)базовом наборе символов(с C++23).

Сужение, если оно выполняется успешно, сохраняет все категории классификации символов, известные is().

  • т.е. is(m, c) || !ctc.is(m, do_narrow(c, dflt)) всегда true для любой названной категории ctype с ctype<char> фасетом ctc и значением ctype_base::mask m (если do_narrow возвращает dflt).

Сужение любого символа-цифры гарантирует, что если результат вычтен из символьного литерала '0', разность равна значению цифры исходного символа.

  • т.е. для любого символа-цифры c, выражение (do_narrow(c, dflt) - ’0’) вычисляется до значения цифры символа.

Параметры

c - символ для преобразования
dflt - значение по умолчанию для вывода, если преобразование не удалось
beg - указатель на первый символ в массиве символов для преобразования
end - указатель на конец массива символов для преобразования
dst - указатель на первый элемент массива символов для заполнения

Возвращаемое значение

1,3) Суженный символ или dflt если сужение не удалось.
2,4) end

Пример

#include <iostream>
#include <locale>
 
void try_narrow(const std::ctype<wchar_t>& f, wchar_t c)
{
    char n = f.narrow(c, 0);
    if (n)
        std::wcout << '\'' << c << "' narrowed to " << +(unsigned char)n << '\n';
    else
        std::wcout << '\'' << c << "' could not be narrowed\n";
}
 
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    std::wcout.imbue(std::locale());
    std::wcout << std::hex << std::showbase << "In US English UTF-8 locale:\n";
    auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
    try_narrow(f, L'A');
    try_narrow(f, L'A');
    try_narrow(f, L'ě');
 
    std::locale::global(std::locale("cs_CZ.iso88592"));
    auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale());
    std::wcout << "In Czech ISO-8859-2 locale:\n";
    try_narrow(f2, L'A');
    try_narrow(f2, L'A');
    try_narrow(f2, L'ě');
}

Возможный вывод:

In US English UTF-8 locale:
'A' narrowed to 0x41
'A' could not be narrowed
'ě' could not be narrowed
In Czech ISO-8859-2 locale:
'A' narrowed to 0x41
'A' could not be narrowed
'ě' narrowed to 0xec

Отчеты об ошибках

Следующие отчеты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применён к Поведение, как опубликовано Правильное поведение
LWG 126 C++98 1. код, представляющий обратимость,
do_widen(do_narrow(c), 0) == c
2. код, представляющий сохранение категорий,
is(m, c) || !ctc.is(m, do_narrow(c), dflt)
оба исправлены
LWG 153 C++98 narrow всегда вызывал перегрузку (4) вызывает соответствующую перегрузку

См. также

widen
вызывает do_widen
(публичная член-функция)
narrow
сужает символы
(публичная член-функция std::basic_ios<CharT,Traits>)
wctob
сужает широкий символ до однобайтового суженного символа, если это возможно
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/ctype/narrow

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API