c++ - 如何从 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
. 有人可以帮忙吗?
解决方案
如果您希望使用 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);
推荐阅读
- google-bigquery - 为什么以下 Bigquery 插入失败?
- excel - 跨不同工作表的 VBA 匹配
- ruby-on-rails - 无法在 Rails 应用程序中重置/更新 jQuery Chosen 上的选项
- dart - Flutter如何为不同的屏幕显示不同的tabBars?
- mpi - 使用机器文件 Ubuntu 18.04 执行 mpi 的问题
- angular - 离子选择 ngModel 整个对象
- python - 使用 ElementTree 查找节点 - 无效谓词
- c# - 升级 SignalR
- javascript - 用茉莉花测试AngularFireAuth的功能
- java - 具有多个实现接口的枚举的 Java 泛型