在我正在编写的string类中,有以下代码作为私有函数(它是从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?
发布于 2014-02-07 12:54:34
codecvt_utf8是一个独立的、与地区无关的方面,由标准库提供.没有必要使用use_facet来访问它。
您从use_facet<T>得到的是在您的区域设置中使用id T::id的任何方面,这恰好是它的代码
https://stackoverflow.com/questions/21627895
复制相似问题