首页 > 解决方案 > 如何从 Little-Endian UTF-16 编码字节获取 C++ std::string

问题描述

我有一个第 3 方设备,它通过没有很好记录的专有通信协议与我的 Linux 机器通信。一些数据包传送“字符串”,在阅读了这篇 Joel On Software 文章后,似乎采用 UTF16 Little-Endian 编码。换句话说,在收到此类数据包后,我在 Linux 机器上拥有的东西是

// The string "Out"
unsigned char data1[] = {0x4f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00};

// The string "°F"
unsigned char data2[] = {0xb0, 0x00, 0x46, 0x00, 0x00, 0x00};

据我了解,我不能将这些视为 a,std::wstring因为在 Linux 上 awchar_t是 4 个字节。然而,我确实有一件事情适合我,因为我的 Linux 机器也是 Little-Endian。所以,我相信我需要使用类似std::codecvt_utf8_utf16<char16_t>. 但是,即使在阅读了文档之后,我也无法弄清楚如何从一个实际转到unsigned char[]一个std::string. 有人可以帮忙吗?

标签: c++stringutf-16unicode-string

解决方案


如果您希望使用 std::codcvt(自 C++ 17 起已弃用),您可以包装 UTF-16 文本,然后在需要时将其转换为 UTF-8。

IE

// simply cast raw data for constructor, since we known that char 
// is actually 'byte' array from network API
std::u16string u16_str( reinterpret_cast<const char16_t*>(data2) );

// UTF-16/char16_t to UTF-8
std::string u8_conv = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t>{}.to_bytes(u16_str);

推荐阅读