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::maskm(если только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) == c2. код, задающий сохранение категорий, был is(m, c) || !ctc.is(m, do_narrow(c), dflt) | исправлены оба |
| LWG 153 | C++98 |
narrow всегда вызывала перегрузку (4) | вызывает соответствующую перегрузку |
См. также
вызывает do_widen (открытая функция-член) |
|
| сужает символы (открытая функция-член std::basic_ios<CharT,Traits>) |
|
| сужает широкий символ до однобайтового узкого символа, если это возможно (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/ctype/narrow