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

标签 c++ utf-16 stdstring

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

我正在寻找一个库(在 STL 和 Boost 中搜索但没有运气)或一组 C/C++ 函数来处理从文件格式加载或保存到文件格式时的这种 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);

但是据我所知,到目前为止唯一具有此功能的实现是 libc++。 C++11 也有 std::codecvt_utf8_utf16<char16_t>其他一些实现有。具体来说,codecvt_utf8_utf16适用于 VS 2010 及更高版本,并且由于 Windows 使用 wchar_t 来表示 UTF-16,因此您可以将其用于 convert between UTF-8 and Windows' native encoding .


The specialization codecvt<char16_t, char, mbstate_t> converts between the UTF-16 and UTF-8 encoding schemes, and the specialization codecvt<char32_t, char, mbstate_t> converts between the UTF-32 and UTF-8 encoding schemes.

                                                                                                                         — [locale.codecvt] 22.4.1.4/3


哦,std::codecvt 特化具有 protected 析构函数,而 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;

关于c++ - 将 std::string 编码/解码为 UTF-16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11086183/

相关文章:

c++ - 如何在 Sieve_of_Eratosthenes 中使用更少的内存

c++ - CMake 无法找到对应于 "Unix Makefiles"的构建程序

python - 在 Python 中将带 BOM 的 UTF-8 转换为不带 BOM 的 UTF-8

c++ - 在 C++11 中,将引用/指针返回到 std::string 中某个位置的最高效方法是什么?

c++ - 如何将 wchar_t* 转换为 std::string?

c++ - QStackedWidget 从第 1 页导航到第 2 页

java - Java 使用 UTF-8 还是 UTF-16 编码?

unicode - Unicode 联盟是否打算让 UTF-16 用完字符?

c++ - basic_regex 使用 char32_t 抛出 bad_cast

c++ - DirectShow 困境 - 无法录制