从大多数UTF-8字符流中读取时,`std :: wstringstream`产生奇怪的行为

时间:2019-04-02 03:04:42

标签: c++ string encoding utf-8

我正在处理一个基于C ++的REST API的错误,该API运行诸如net start之类的Windows命令并以JSON返回输出(使用nlohmann::json

最初,代码使用std::stringstream,将命令的整个输出插入其中,并使用str()返回字符串表示形式,然后将此字符串插入到nlohmann::json对象中。这对于UTF-8效果很好,对于UTF-16来说,std::stringstream不是正确的选择。

我们遇到了一个客户端问题,该客户端的Windows服务具有非UTF-8字符,尽管它由std::stringstream进行了解析,但没有打h,但在插入JSON对象时却不是UTF-8字符,这引起了问题。

要解决此问题,最明显的解决方案是使用std::wstringstream,以便返回我将转换为wstring的{​​{1}}(我们的API使用std::string版本)使用basic_string<char>。我这样做,代码编译,运行API以查看问题是否解决,并返回包含所有汉字和大量null(\ u0000)的输出。

这是一个很奇怪的行为,std::wstring_convert命令的输出大部分是所有UTF-8字符,它们是一个宽字符的子集,正确读取它们应该不是问题,对吗?通过net start对象的字符迭代来查看字符的十六进制表示,看起来std::wstring似乎正在从该命令读取输出的多个字节,因此十六进制输出对应于Unicode代码点用于汉字。

我的主要问题是-

在使用wstringstream来读取大部分为UTF-8字符的流时,由于它表示多字节字符(std::wstringstream),因此可以一次读取多个字节吗?因此,不是UTF-8英文字符,而是以UTF-16汉字结尾(或基于十六进制表示形式的UTF-16平面中的其他某种语言)吗?

我整天都为此努力,即使使用wchar_t之类的std::u16string也会产生相同的输出。唯一的其他选择是逐字节检查输出字符串,以检查字符是否为有效的UTF-8。

感谢所有帮助!

0 个答案:

没有答案