std::ctype<CharT>::widen, do_widen
Определено в заголовочном файле <locale> | ||
|---|---|---|
public: CharT widen( char c ) const; | (1) | |
public: const char* widen( const char* beg, const char* end, CharT* dst ) const; | (2) | |
protected: virtual CharT do_widen( char c ) const; | (3) | |
protected: virtual const char* do_widen( const char* beg, const char* end, CharT* dst ) const; | (4) |
do_widen перегрузку самого производного класса. Перегрузка (1) вызывает do_widen(c), перегрузка (2) вызывает do_widen(beg, end, dst).c в соответствующее представление широкого символа, используя простейшее разумное преобразование. Как правило, это применяется только к символам, чье многобайтовое кодирование представляет собой один байт (например, U+0000-U+007F в UTF-8).[beg, end), записывает соответствующий расширенный символ в последующие места в массиве символов, на который указывает dst.Расширение всегда возвращает символ широкого типа, но только символы из базового набора символов исходного текста(до C++23)базового набора символов(начиная с C++23) гарантированно имеют уникальное, хорошо определённое расширенное преобразование, которое также гарантированно обратимо (функцией narrow()). На практике, все символы, чье многобайтовое представление занимает один байт, обычно расширяются до своих аналогов символов широкого типа, а остальная часть возможных однобайтовых значений обычно отображается в одном и том же замещающем значении, обычно CharT(-1).
Расширение, если успешно, сохраняет все категории классификации символов, известные is().
Параметры
| c | - | символ для преобразования |
| dflt | - | значение по умолчанию, которое генерируется в случае неудачи преобразования |
| beg | - | указатель на первый символ в массиве символов для преобразования |
| end | - | указатель, следующий за концом массива символов для преобразования |
| dst | - | указатель на первый элемент массива символов для заполнения |
Возвращаемое значение
end
Пример
#include <iostream>
#include <locale>
void try_widen(const std::ctype<wchar_t>& f, char c)
{
wchar_t w = f.widen(c);
std::cout << "The single-byte character " << +(unsigned char)c
<< " widens to " << +w << '\n';
}
int main()
{
std::locale::global(std::locale("cs_CZ.iso88592"));
auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
std::cout << std::hex << std::showbase << "In Czech ISO-8859-2 locale:\n";
try_widen(f, 'a');
try_widen(f, '\xdf'); // German letter ß (U+00df) in ISO-8859-2
try_widen(f, '\xec'); // Czech letter ě (U+011b) in ISO-8859-2
std::locale::global(std::locale("cs_CZ.utf8"));
auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale());
std::cout << "In Czech UTF-8 locale:\n";
try_widen(f2, 'a');
try_widen(f2, '\xdf');
try_widen(f2, '\xec');
}Возможный вывод:
In Czech ISO-8859-2 locale: The single-byte character 0x61 widens to 0x61 The single-byte character 0xdf widens to 0xdf The single-byte character 0xec widens to 0x11b In Czech UTF-8 locale: The single-byte character 0x61 widens to 0x61 The single-byte character 0xdf widens to 0xffffffff The single-byte character 0xec widens to 0xffffffff
Сообщения об ошибках
Следующие сообщения об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 153 | C++98 |
widen всегда вызывал перегрузку (4) | вызывает соответствующую перегрузку |
См. также
вызывает do_narrow (публичная член-функция) |
|
| расширяет символы (публичная член-функция 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/widen