C++ 无法使用boost read_json读取umlauts
我无法用boost::property\u tree::read\u json解决我的问题。我有MFC项目与MBCS编码多字节字符集。读取带有ä字符的数据时出错。这是我的例子:C++ 无法使用boost read_json读取umlauts,c++,json,boost,encoding,mfc,C++,Json,Boost,Encoding,Mfc,我无法用boost::property\u tree::read\u json解决我的问题。我有MFC项目与MBCS编码多字节字符集。读取带有ä字符的数据时出错。这是我的例子: namespace pt = boost::property_tree; pt::ptree rootRequest; //Save data in property tree rootRequest.put("test", "Test ä"); //create stringstream std::strings
namespace pt = boost::property_tree;
pt::ptree rootRequest;
//Save data in property tree
rootRequest.put("test", "Test ä");
//create stringstream
std::stringstream ss;
//Write rootRequest to stringstream
try
{
pt::write_json(ss, rootRequest);
}
catch (std::exception const &e)
{
TRACE("Error: [%s]\n", e.what());
}
//Get string from stringstream
std::string strRequest = ss.str();
TRACE("data: [%s]\n", CString(strRequest.c_str()));
//Clear stringstream
ss.str(std::string());
//Sate data to stringstream
ss << strRequest;
//Save string data in ptree value
pt::ptree rootResponse;
try
{
pt::read_json(ss, rootResponse); //Here I'm getting error
}
catch (std::exception const &e)
{
TRACE("Error: [%s]\n", e.what());
}
我得到以下异常:
<unspecified file>(2): invalid code sequence
哪种方式读取这样的数据是正确的?我希望有人能帮我。我需要以字符串形式保存数据,然后将其再次读取到stringstream。无法更改此部分。JSON无法存储MBCS字符串。这意味着在保存之前必须将所有标签和值转换为UTF-8或UTF-16 UTF-8是JSON的常用选择,不仅因为它使用更少的字符串内存,还因为UTF-8编码具有1对1唯一的glyph编码,而UTF-16则没有 以下是如何转换字符串: MBCS到Unicode:
#include <windows.h>
#include <string>
std::wstring MBCS_to_UTF16(LPCSTR sz)
{
// MBCS to UNICODE
std::wstring strResult;
size_t nCharsDone = 0;
const size_t nMaxsWords = 6 * strlen(sz);
strResult.resize(nMaxsWords + 1);
if (S_OK == ::mbstowcs_s(&nCharsDone, &strResult[0], nMaxsWords + 1, sz, nMaxsWords))
strResult.resize(nCharsDone);
else
strResult.clear();
return strResult;
}
JSON无法存储MBCS字符串。这意味着在保存之前必须将所有标签和值转换为UTF-8或UTF-16 UTF-8是JSON的常用选择,不仅因为它使用更少的字符串内存,还因为UTF-8编码具有1对1唯一的glyph编码,而UTF-16则没有 以下是如何转换字符串: MBCS到Unicode:
#include <windows.h>
#include <string>
std::wstring MBCS_to_UTF16(LPCSTR sz)
{
// MBCS to UNICODE
std::wstring strResult;
size_t nCharsDone = 0;
const size_t nMaxsWords = 6 * strlen(sz);
strResult.resize(nMaxsWords + 1);
if (S_OK == ::mbstowcs_s(&nCharsDone, &strResult[0], nMaxsWords + 1, sz, nMaxsWords))
strResult.resize(nCharsDone);
else
strResult.clear();
return strResult;
}
不要使用MBCS编码。在新项目中使用UNICODE,自从微软将Windows的本机字符串格式更改为UNICODE以来,MBCS已经过时了。我不能。我有维护项目,无法更改编码。JSON无法处理原始MBC,必须将所有字符串转换为UTF-8或从UTF-8转换为原始MBC。请勿使用MBC编码。在新项目中使用UNICODE,自从微软将Windows的本机字符串格式更改为UNICODE以来,MBCS已经过时了。我不能。我有维护项目,编码无法更改。JSON无法处理原始MBC,您必须将所有字符串转换为UTF-8或从UTF-8转换。由于C++11,MBC转换可以简化,对于MBC->UTF-16:std::wstring_convert conv;std::wstring outputf16=conv.from_字节inputMBCS;对于UTF-16->MBCS:std::string outputMBCS=conv.to_bytes inputf16;。为了处理转换错误,捕获std::range_error。由于C++11,MBCS转换可以简化,对于MBCS->UTF-16:std::wstring_conv;std::wstring outputf16=conv.from_字节inputMBCS;对于UTF-16->MBCS:std::string outputMBCS=conv.to_bytes inputf16;。要处理转换错误,请捕获std::range\u错误。
std::string UTF16_to_MBCS(LPCWSTR wsz)
{
// MBCS to UNICODE
std::string strResult;
size_t nCharsDone = 0;
const size_t nMaxWords = 2 * wcslen(wsz);
strResult.resize(nMaxWords + 1);
if (S_OK == ::wcstombs_s(&nCharsDone, &strResult[0], nMaxWords + 1, wsz, nMaxWords))
strResult.resize(nCharsDone);
else
strResult.clear();
return strResult;
}