我必须处理一种文件格式(包括读取和写入),其中字符串以UTF-16编码(每个字符2个字节)。由于ASCII表之外的字符很少在应用程序域中使用,因此我的C++模型类中的所有字符串都存储在std::string (UTF-8编码)的实例中。
我正在寻找一个库(在STL和Boost中搜索,没有运气)或一组C/C++函数来处理从文件格式加载或保存为文件格式(实际上建模为字节流)时的std::string <-> UTF-16转换,包括生成/识别代理对和所有Unicode内容(诚然,我不是专家)……
有什么建议吗?谢谢!
编辑:忘了说它应该是跨平台的(Win / Mac),不能使用C++11。
发布于 2012-06-18 23:46:25
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);
具体地说,codecvt_utf8_utf16
可以在VS2010及更高版本中工作,而且由于wchar_t用于表示UTF-16,因此您可以将其用于convert between UTF-8 and Windows' native encoding。
专门化
codecvt<char16_t, char, mbstate_t>
在UTF-16和UTF-8编码方案之间进行转换,专门化codecvt<char32_t, char, mbstate_t>
在UTF-32和UTF-8编码方案之间进行转换。
- locale.codecvt 22.4.1.4/3
哦,而且std::codecvt特殊化有受保护的析构函数,而wstring_convert需要访问析构函数,所以你真的需要一个适配器:
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;
发布于 2012-06-18 23:54:00
This page特别描述了如何进行Boost.Locale到UTF的转换,以及如何将其与IOStreams集成。
发布于 2018-10-09 11:34:38
我建议你看一看:
Convert C++ std::string to UTF-16-LE encoded string
并查看iconv函数。它是一个C库,对C++11没有要求。
在https://github.com/win-iconv/win-iconv上还有一个特定于Win32的图标库。
https://stackoverflow.com/questions/11086183
复制相似问题