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