42template <
class charT,
class Traits>
47 typedef typename Traits::state_type
StateT;
48 typedef std::codecvt<wchar_t, charT, StateT>
Codecvt;
52 const std::size_t
slen = std::char_traits<wchar_t>::length (
s);
57 const std::size_t xbufsize = 32;
59 charT xbuf [xbufsize];
60 charT* xbuf_end = xbuf + xbufsize;
62 const wchar_t* from_next = 0;
67 for (
const wchar_t*
base =
s; from_next !=
end;
base = from_next) {
69 const std::codecvt_base::result
res =
71 xbuf, xbuf_end, to_next);
73 std::streamsize nbytes = to_next - xbuf;
80 strm.rdbuf ()->sputn (xbuf, nbytes);
85 if (nbytes !=
strm.rdbuf ()->sputn (xbuf, nbytes)) {
102 nbytes = to_next - xbuf;
104 if (nbytes !=
strm.rdbuf ()->sputn (xbuf, nbytes)) {
114template <
class charT,
class Traits>
115std::basic_ostream<charT, Traits>&
119 const typename std::basic_ostream<charT, Traits>::sentry
opfx (
strm);
134 catch (std::ios_base::failure&) {
150static const wchar_t*
const wcs [] = {
157 L"\x0391\x0392\x0393",
163 L"\x0f22\x0f21\x0f20"
169 typedef std::codecvt_byname<wchar_t, char, std::mbstate_t>
Codecvt;
172 const std::locale utf (std::cout.getloc (),
new Codecvt (
"UTF-8@UCS"));
174 for (std::size_t
i = 0;
i !=
sizeof wcs /
sizeof *wcs; ++
i) {
176 std::ostringstream
strm;
187 std::cout <<
"UCS-2: " << std::hex;
189 for (
const wchar_t *pwc = wcs [
i]; *pwc !=
L'\0'; ++pwc)
190 std::cout <<
"U+" <<
unsigned (*pwc) <<
' ';
192 const std::string
str =
strm.str ();
194 std::cout <<
" ==> UTF-8: \"";
196 typedef unsigned char UChar;
201 for (
const char *pc =
str.c_str (); *pc !=
'\0'; ++pc) {
206 if ((std::isalnum)(*pc, std::cout.getloc ()))
209 std::cout <<
"\\x" << int (
UChar (*pc));
std::codecvt< char, char, std::mbstate_t > Codecvt
void streambuf_insert(std::basic_ostream< charT, Traits > &strm, const wchar_t *s)
std::basic_ostream< charT, Traits > & operator<<(std::basic_ostream< charT, Traits > &strm, const wchar_t *s)