C++ 将std::字符串编码/解码为UTF-16

C++ 将std::字符串编码/解码为UTF-16,c++,utf-16,stdstring,C++,Utf 16,Stdstring,我必须处理一种文件格式(读取和写入),其中字符串以UTF-16编码(每个字符2个字节)。由于ASCII表中的字符很少在应用程序域中使用,所以在我的C++模型类中的所有字符串都存储在STD::string(UTF-8编码)的实例中。 我正在寻找一个库(在STL和Boost中搜索,没有运气)或一组C/C++函数来处理从文件格式加载或保存到文件格式(实际上建模为ByTestStream)时的std::string UTF-16转换,包括代理项对的生成/识别以及所有Unicode的东西(我承认我对这方面

我必须处理一种文件格式(读取和写入),其中字符串以UTF-16编码(每个字符2个字节)。由于ASCII表中的字符很少在应用程序域中使用,所以在我的C++模型类中的所有字符串都存储在STD::string(UTF-8编码)的实例中。 我正在寻找一个库(在STL和Boost中搜索,没有运气)或一组C/C++函数来处理从文件格式加载或保存到文件格式(实际上建模为ByTestStream)时的std::string UTF-16转换,包括代理项对的生成/识别以及所有Unicode的东西(我承认我对这方面不是专家)

有什么建议吗?谢谢


编辑:忘记提到它应该是跨平台的(Win/Mac),不能使用C++11。

C++11具有以下功能:

std::string s = u8"Hello, World!";

// #include <codecvt>
std::wstring_convert<std::codecvt<char16_t,char,std::mbstate_t>,char16_t> convert;

std::u16string u16 = convert.from_bytes(s);
std::string u8 = convert.to_bytes(u16);

你看了吗,特别介绍了如何进行UTF到UTF的转换以及如何将其与IOStreams集成。

我建议看一下:

并检查iconv功能。这是一个C库,对C++11没有任何要求


还有一个特定于Win32的iconv库。

啊,我查看了ICU,但它似乎太大了,无法完成我的任务。如果您只针对windows,请使用,在所有其他情况下,请使用。这可以自己做,但不应该。这已经被问了很多次了,我最熟悉的一个是哦,嘿,哇,什么+1我从未见过:)嗯,做了一个测试用例来测试扩展平面字符,但IDEOne不会编译:@MooingDuck不幸的是libstdc++还没有实现这些专门化,即使是在gcc 4.7中。如何管理utf-16 BE或utf-16 LE并能够在它们之间切换(在写入文件时)?@Sandburg UTF codecvt facets的模板参数之一是codecvt_模式,允许您指定endianness和bom等选项。
template <class Facet>
class usable_facet : public Facet {
public:
    using Facet::Facet; // inherit constructors
    ~usable_facet() {}

    // workaround for compilers without inheriting constructors:
    // template <class ...Args> usable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
};

template<typename internT, typename externT, typename stateT> 
using codecvt = usable_facet<std::codecvt<internT, externT, stateT>>;

std::wstring_convert<codecvt<char16_t,char,std::mbstate_t>> convert;