为了支持Unicode,string便有了
template<class _CharT>
struct char_traits;
template<typename _CharT, typename _Traits = char_traits<_CharT>,
typename _Alloc = allocator<_CharT> >
class basic_string;
template<> struct char_traits<char>;
/// A string of @c char
typedef basic_string<char> string;
#ifdef _GLIBCXX_USE_WCHAR_T
template<> struct char_traits<wchar_t>;
/// A string of @c wchar_t
typedef basic_string<wchar_t> wstring;
#endif
#if ((__cplusplus >= 201103L) \
&& defined(_GLIBCXX_USE_C99_STDINT_TR1))
template<> struct char_traits<char16_t>;
template<> struct char_traits<char32_t>;
/// A string of @c char16_t
typedef basic_string<char16_t> u16string;
/// A string of @c char32_t
typedef basic_string<char32_t> u32string;
#endif
u16string
u32string
可是,没有
u16cout
u32cout
所以,
还是自己做吧。
#include<iostream>
using namespace std;
typedef basic_ostream<char16_t> u16ostream;
typedef basic_streambuf<char16_t> u16streambuf;
u16ostream u16cout(reinterpret_cast<u16streambuf*>(wcout.rdbuf()));
这还是托Windows里char16_t == wchar_t的缘故…
如果你是unix,请将’u16’改成’u32’。
试试
#include<io.h>
#include<fcntl.h>
int main(){
_setmode(_fileno(stdout),_O_U16TEXT);
u16cout<<u"look at the \u08a6";
}
结果:
ࢦ
完