首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将std::string编码/解码为UTF-16

将std::string编码/解码为UTF-16
EN

Stack Overflow用户
提问于 2012-06-18 23:37:09
回答 3查看 28.2K关注 0票数 9

我必须处理一种文件格式(包括读取和写入),其中字符串以UTF-16编码(每个字符2个字节)。由于ASCII表之外的字符很少在应用程序域中使用,因此我的C++模型类中的所有字符串都存储在std::string (UTF-8编码)的实例中。

我正在寻找一个库(在STL和Boost中搜索,没有运气)或一组C/C++函数来处理从文件格式加载或保存为文件格式(实际上建模为字节流)时的std::string <-> UTF-16转换,包括生成/识别代理对和所有Unicode内容(诚然,我不是专家)……

有什么建议吗?谢谢!

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

EN

回答 3

Stack Overflow用户

发布于 2012-06-18 23:46:25

C++11具有以下功能:

代码语言:javascript
运行
复制
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需要访问析构函数,所以你真的需要一个适配器:

代码语言:javascript
运行
复制
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;
票数 14
EN

Stack Overflow用户

发布于 2012-06-18 23:54:00

This page特别描述了如何进行Boost.Locale到UTF的转换,以及如何将其与IOStreams集成。

票数 4
EN

Stack Overflow用户

发布于 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的图标库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11086183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档