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/cpp/locale/ctype/narrow

Spec-Zone.ru

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