Boost.Locale
Status of C++11 char16_t/char32_t support

The support of C++11 char16_t and char32_t is experimental and is not intended to be used in production until various compiler/standard library flaws are fixed.

Many recent C++ compilers provide decent support of C++11 characters, however often:

  1. The standard library does not install any std::locale::facets for this support so any attempt to format numbers using char16_t or char32_t streams would just fail.
  2. The standard library misses specialization for required char16_t/char32_t locale facets, so "std" backends is not build-able as essential symbols missing, also codecvt facet can't be created as well.

Visual Studio

MSVC provides all required facets since VS 2010 however:

  1. The standard library does not provide installations of std::locale::id for these facets in DLL so it is not usable with /MD, /MDd compiler flags and requires static link of the runtime library.
  2. char16_t and char32_t are not distinct types but rather aliases of unsigned short and unsigned types which contradicts to C++11 requirements making it impossible to write char16_t/char32_t to stream and causing multiple faults.

If you want to build or test Boost.Locale with C++11 char16_t and char32_t support you should pass define=BOOST_LOCALE_ENABLE_CHAR32_T define=BOOST_LOCALE_ENABLE_CHAR16_T to b2 during build and define BOOST_LOCALE_ENABLE_CHAR32_T and BOOST_LOCALE_ENABLE_CHAR32_T when using Boost.Locale