The underlying C locales provide the thousands_sep and decimal_point as strings, possible with more than one character. We currently don't handle this case even for wchar_t.
This patch properly converts the mbs -> wide character for moneypunct_byname<wchar_t>. For the moneypunct_byname<char> case we attempt to narrow the WC and if that fails we also attempt to translate it to some reasonable value. For example we translate U00A0 (non-breaking space) into U0020 (regular space). If none of these conversions succeed then we simply allow the base class to provide a fallback value.
While you're here, you might change char to wchar_t.