Spec-Zone.ru › C++

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)
1,2) Публичный член-функция, вызывает соответствующую защищенную виртуальную член-функцию do_widen перегрузку самого производного класса. Перегрузка (1) вызывает do_widen(c), перегрузка (2) вызывает do_widen(beg, end, dst).
3) Преобразует однобайтовый символ c в соответствующее представление широкого символа, используя простейшее разумное преобразование. Как правило, это применяется только к символам, чье многобайтовое кодирование представляет собой один байт (например, U+0000-U+007F в UTF-8).
4) Для каждого символа в массиве символов [beg, end), записывает соответствующий расширенный символ в последующие места в массиве символов, на который указывает dst.

Расширение всегда возвращает символ широкого типа, но только символы из базового набора символов исходного текста(до C++23)базового набора символов(начиная с C++23) гарантированно имеют уникальное, хорошо определённое расширенное преобразование, которое также гарантированно обратимо (функцией narrow()). На практике, все символы, чье многобайтовое представление занимает один байт, обычно расширяются до своих аналогов символов широкого типа, а остальная часть возможных однобайтовых значений обычно отображается в одном и том же замещающем значении, обычно CharT(-1).

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

Параметры

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

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

1,3) Расширенный символ.
2,4) 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) вызывает соответствующую перегрузку

См. также

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

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

Spec-Zone.ru

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