C++ 无法使用boost read_json读取umlauts

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

我无法用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::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;
}