我将以下代码作为我正在编写的字符串类中的私有函数(它是从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?
答案 0 :(得分:1)
codecvt_utf8
是一个独立的,与语言环境无关的方面,由标准库提供。没有必要使用use_facet来访问它。
你从use_facet<T>
获得的是你的语言环境中的任何方面,其id为T :: id,恰好是它的codecvt