我正在处理一个基于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。
感谢所有帮助!