简体   繁体   English

codecvt不是std头吗?

[英]Is codecvt not a std header?

This code compiles with Visual C++ 11 and runs as expected on Windows 7 but fails to compile using either MinGW 4.7.0 on Windows 7 or gcc 4.8.0 on Linux. 此代码使用Visual C ++ 11进行编译,并在Windows 7上按预期运行,但无法使用Windows 7上的MinGW 4.7.0或Linux上的gcc 4.8.0进行编译。 Compiling with -std=c++11 flag 使用-std=c++11标志进行编译

#include <codecvt>
#include <string>

// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.from_bytes(str);
}

// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.to_bytes(str);
}

Error: 错误:

codecvt: No such file or directory. codecvt:没有这样的文件或目录。

The reason why GCC rejects this code is simple: libstdc++ doesn't support <codecvt> yet. GCC拒绝此代码的原因很简单:libstdc ++还不支持<codecvt>

The C++11 support status page confirms this: C ++ 11支持状态页面确认了这一点:

22.5 Standard code conversion facets N 22.5标准代码转换方面N.

The question was asked almost 3 years ago and I was surprised that I am also having same issue using Ubuntu 14.04 with fresh updates. 大约3年前问了这个问题,我很惊讶我使用Ubuntu 14.04也遇到了同样的问题。

Second surprise, the link provided by @Fanael shows now: 第二个惊喜,@ Fanael提供的链接现在显示:

22.5 Standard code conversion facets Y 22.5标准代码转换方面Y.

So I searched which version of GCC would fully implement C++11. 所以我搜索了哪个版本的GCC将完全实现C ++ 11。 Turns out that full support was added in GCC 5: 事实证明,在GCC 5中增加了全面支持:

https://gcc.gnu.org/gcc-5/changes.html https://gcc.gnu.org/gcc-5/changes.html

Full support for C++11, including the following new features: 完全支持C ++ 11,包括以下新功能:

... ...

locale facets for Unicode conversion; 用于Unicode转换的区域设置方面;

... ...

I would have been happy to put a comment on the answer if I had enough reputation :) 如果我有足够的声誉,我会很乐意对答案发表评论:)

A workaround using Boost.Locale : 使用Boost.Locale的变通方法:

#include <boost/locale/encoding_utf.hpp>
#include <string>

using boost::locale::conv::utf_to_utf;

std::wstring utf8_to_wstring(const std::string& str)
{
    return utf_to_utf<wchar_t>(str.c_str(), str.c_str() + str.size());
}

std::string wstring_to_utf8(const std::wstring& str)
{
    return utf_to_utf<char>(str.c_str(), str.c_str() + str.size());
}  

它适用于Ubuntu 14.04和gcc 5.3。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM