我在编写的字符串类中将以下代码作为私有函数使用(它是从wstring_convert借来的,并由我完成了一些修改):
template <typename T>
std::string my_string::to_bytes(const typename T::intern_type *_First, const typename T::intern_type *_Last) const
{
const T* p_conv = &std::use_facet<T>(m_loc);
...
switch (p_conv->out(_State0, _First, _Last, _First, _Dest, _Dest + _Bbuf.size(), _Dnext))
{
...
}
}
m_loc
是包含系统区域设置的全局std :: locale。这样的函数不是问题,问题是当我这样调用函数时:
const wchar_t *_Wptr = wstr.c_str();
m_utf8 += to_bytes<codecvt_utf8<wchar_t>>(_Wptr, _Wptr + wstr.size());
它实际上并不使用
codecvt_utf8<wchar_t>
(在本机wchar_t和utf-8之间转换),而是使用codecvt<wchar_t, char>
(在本机wchar_t和本机char之间转换)。我一生无法理解为什么会这样。显然,我必须在某个地方做些错误的事情,并且我可以接受语言环境系统的所有方面,这让我有些困惑。我想这在某种程度上与use_facet和我的语言环境有关。也许语言环境无法创建utf-8构面?那句话说得通吗?也许我没有正确使用use_facet?
最佳答案
codecvt_utf8
是标准库提供的独立的,与语言环境无关的构面。无需使用use_facet进行访问。
从use_facet<T>
获得的是您所在语言环境中ID为T :: id的任何方面,恰好是其编解码器
关于c++ - codecvt_utf8 <wchar_t>转换为本地codecvt <wchar_t,char>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21627895/