namespace std {
class codecvt_base {
public:
enum result { ok, partial, error, noconv };
};
template<class internT, class externT, class stateT>
class codecvt : public locale::facet, public codecvt_base {
public:
using intern_type = internT;
using extern_type = externT;
using state_type = stateT;
explicit codecvt(size_t refs = 0);
result out(
stateT& state,
const internT* from, const internT* from_end, const internT*& from_next,
externT* to, externT* to_end, externT*& to_next) const;
result unshift(
stateT& state,
externT* to, externT* to_end, externT*& to_next) const;
result in(
stateT& state,
const externT* from, const externT* from_end, const externT*& from_next,
internT* to, internT* to_end, internT*& to_next) const;
int encoding() const noexcept;
bool always_noconv() const noexcept;
int length(stateT&, const externT* from, const externT* end, size_t max) const;
int max_length() const noexcept;
static locale::id id;
protected:
~codecvt();
virtual result do_out(
stateT& state,
const internT* from, const internT* from_end, const internT*& from_next,
externT* to, externT* to_end, externT*& to_next) const;
virtual result do_in(
stateT& state,
const externT* from, const externT* from_end, const externT*& from_next,
internT* to, internT* to_end, internT*& to_next) const;
virtual result do_unshift(
stateT& state,
externT* to, externT* to_end, externT*& to_next) const;
virtual int do_encoding() const noexcept;
virtual bool do_always_noconv() const noexcept;
virtual int do_length(stateT&, const externT* from, const externT* end, size_t max) const;
virtual int do_max_length() const noexcept;
};
}
The class
codecvt<internT, externT, stateT>
is for use when
converting from one character encoding to another, such as from wide characters
to multibyte characters or between wide character encodings such as
UTF-32 and EUC
.The
stateT
argument selects the pair of character encodings being mapped between
.The specializations required in Table
102 (
[locale.category])
convert the implementation-defined native character set
. codecvt<char, char, mbstate_t>
implements a degenerate conversion;
it does not convert at all
. The specialization
codecvt<char16_t, char8_t, mbstate_t>
converts between the UTF-16 and UTF-8 encoding forms, and
the specialization
codecvt <char32_t, char8_t, mbstate_t>
converts between the UTF-32 and UTF-8 encoding forms
. codecvt<wchar_t, char, mbstate_t>
converts between the native character sets for ordinary and wide characters
. Specializations on
mbstate_t
perform conversion between encodings known to the library implementer
. Other encodings can be converted by specializing on a program-defined
stateT
type
. Objects of type
stateT
can contain any state that is useful to communicate to or from
the specialized
do_in
or
do_out
members
.result out(
stateT& state,
const internT* from, const internT* from_end, const internT*& from_next,
externT* to, externT* to_end, externT*& to_next) const;
Returns: do_out(state, from, from_end, from_next, to, to_end, to_next). result unshift(stateT& state, externT* to, externT* to_end, externT*& to_next) const;
Returns: do_unshift(state, to, to_end, to_next). result in(
stateT& state,
const externT* from, const externT* from_end, const externT*& from_next,
internT* to, internT* to_end, internT*& to_next) const;
Returns: do_in(state, from, from_end, from_next, to, to_end, to_next). int encoding() const noexcept;
bool always_noconv() const noexcept;
Returns: do_always_noconv(). int length(stateT& state, const externT* from, const externT* from_end, size_t max) const;
Returns: do_length(state, from, from_end, max). int max_length() const noexcept;
Returns: do_max_length(). result do_out(
stateT& state,
const internT* from, const internT* from_end, const internT*& from_next,
externT* to, externT* to_end, externT*& to_next) const;
result do_in(
stateT& state,
const externT* from, const externT* from_end, const externT*& from_next,
internT* to, internT* to_end, internT*& to_next) const;
Preconditions: (from <= from_end && to <= to_end) is well-defined and
true;
state is initialized, if at the beginning of a sequence,
or else is equal to the result of converting the preceding characters in the sequence
. Effects: Translates characters in the source range
[
from, from_end),
placing the results in sequential positions starting at destination
to. Converts no more than
(from_end - from)
source elements, and
stores no more than
(to_end - to)
destination elements
.Stops if it encounters a character it cannot convert
. It always leaves the
from_next and
to_next pointers
pointing one beyond the last element successfully converted
. If returns
noconv,
internT
and
externT
are the same type and the converted sequence is
identical to the input sequence
[
from, from_next)
. to_next is set equal to
to, the value of
state is
unchanged, and there are no changes to the values in
[
to, to_end)
. A
codecvt
facet that is used by
basic_filebuf (
[file.streams]) shall have the property that if
do_out(state, from, from_end, from_next, to, to_end, to_next)
would return
ok,
where
from != from_end,
then
do_out(state, from, from + 1, from_next, to, to_end, to_next)
shall also return
ok,
and that if
do_in(state, from, from_end, from_next, to, to_end, to_next)
would return
ok,
where
to != to_end,
then
do_in(state, from, from_end, from_next, to, to + 1, to_next)
shall also return
ok. [
Note: As a result of operations on
state, it can return
ok or
partial and set
from_next == from and
to_next != to. —
end note ]
Remarks: Its operations on
state are unspecified
. [
Note: This argument can be used, for example, to maintain
shift state, to specify conversion options (such as count only), or to
identify a cache of seek offsets
. —
end note ]
Returns: An enumeration value, as summarized in Table
104. Table
104:
do_in/do_out result values [tab:locale.codecvt.inout]
Value | Meaning |
ok | completed the conversion |
partial | not all source characters converted |
error | encountered a character in [from, from_end)
that it could not convert |
noconv | internT and externT are the same type, and input
sequence is identical to converted sequence |
A return value of
partial,
if
(from_next == from_end),
indicates that either the destination sequence has not absorbed all the
available destination elements, or that additional source elements are
needed before another destination element can be produced
.result do_unshift(stateT& state, externT* to, externT* to_end, externT*& to_next) const;
Preconditions: (to <= to_end) is well-defined and
true;
state is initialized, if at the beginning of a sequence,
or else is equal to the result of converting the preceding characters in the
sequence
. Effects: Places characters starting at
to that should be appended
to terminate a sequence when the current
stateT
is given by
state.
Stores no more than
(to_end - to)
destination elements, and leaves the
to_next pointer
pointing one beyond the last element successfully stored
.Returns: An enumeration value, as summarized in Table
105. Table
105:
do_unshift result values [tab:locale.codecvt.unshift]
Value | Meaning |
ok | completed the sequence |
partial | space for more than to_end - to destination elements was needed
to terminate a sequence given the value of state |
error | an unspecified error has occurred |
noconv | no termination is needed for this state_type |
int do_encoding() const noexcept;
Returns: -1 if the encoding of the
externT sequence is state-dependent; else the
constant number of
externT characters needed to produce an internal
character; or
0 if this number is not a constant
. bool do_always_noconv() const noexcept;
Returns: true
if
do_in()
and
do_out()
return
noconv
for all valid argument values
. codecvt<char, char, mbstate_t>
returns
true. int do_length(stateT& state, const externT* from, const externT* from_end, size_t max) const;
Preconditions: (from <= from_end) is well-defined and
true;
state is initialized, if at the beginning of a sequence,
or else is equal to the result of converting the preceding characters in the sequence
. Effects: The effect on the
state argument is as if it called
do_in(state, from, from_end, from, to, to+max, to)
for
to pointing to a buffer of at least
max elements
. Returns: (from_next-from)
where
from_next
is the largest value in the range
[
from, from_end]
such that the sequence of values in the range
[
from, from_next)
represents
max
or fewer valid complete characters of type
internT. The specialization
codecvt<char, char, mbstate_t>,
returns the lesser of
max
and
(from_end-from).int do_max_length() const noexcept;
Returns: The maximum value that
do_length(state, from, from_end, 1)
can return for any valid range
[
from, from_end)
and
stateT
value
state. The specialization
codecvt<char, char, mbstate_t>::do_max_length()
returns 1
.