2016-03-02 132 views
3

我已阅读所有jsoncpp文档here,我知道如何使用jsoncpp作为char *和std :: string,但是,我需要一种方法来获取wchar数据我的json文件。我猜这可以通过使用json_reader.cpp中的decodeString函数来完成。该文档没有描述令牌是参数还是输出参数,或者我是如何获得该令牌的,因为它是[in]参数。我已经搜索了2天以上,我似乎无法找到主角。如何在jsoncpp中使用decodeString来解码包含unicode字符的字符串

任何形式的建议或链接都​​非常受欢迎。

+0

是什么'wchar'中的点?如果它是一些api要求,那么api应该有某种[convert_from_utf8](https://doc.qt.io/qt-4.8/qstring.html#fromUtf8)[function](https://msdn.microsoft .COM/EN-US /库/窗/桌面/ dd319072(v = vs.85)的.aspx)。 – deniss

+0

我需要从json文件读取德文文本并将其转换为.dat文件。但是文字会写成:wuetend,实际上应该是wütend。因此,我需要wchar。 –

+0

utf8中的'ü'是一个字节序列'C3 BC'。所以它编码为ascii时是''''。你如何阅读.dat文件?我想你的查看器使用ascii编码,这在处理unicode时不是一个好主意。 – deniss

回答

1

Windows使用UTF16 UNICODE标准。新的Windows项目应该使用UNICODE设置进行设置。

基于Linux和互联网的网络系统使用UTF8标准。

您通过json接收数据,它可能是UTF8,可用std::stringconst wchar。将其转换为UTF16。使用:

std::string get_utf8(const std::wstring &wstr) 
{ 
    if (wstr.empty()) return std::string(); 
    int sz = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), 0, 0, 0, 0); 
    std::string res(sz, 0); 
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &res[0], sz, 0, 0); 
    return res; 
} 

std::wstring get_utf16(const std::string &str) 
{ 
    if (str.empty()) return std::wstring(); 
    int sz = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), 0, 0); 
    std::wstring res(sz, 0); 
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &res[0], sz); 
    return res; 
} 

例如,

std::string fromJSON = getjson(...); 
std::wstring ws = get_utf16(fromJSON); 

现在Windows可以显示ws

MessageBox(0, ws.c_str(), 0, 0); 

其发送到JSON之前将其转换回UTF8:

std::string str = get_utf8(ws); 
set_JSON_string(str); 
+0

Barmak,非常感谢你的解释,但是,我在Windows XP上使用MultiByteToWideChar存在困难。上面的代码在Vista和更高版本上工作得很好,但是在XP上,我只是获取了块而不是实际的数据。 –

+0

XP错误可能来自JSON,也可能来自“MultiByteToWideChar”,但我无法猜测发生了什么。 –

+0

我想出了为什么它不能在XP上工作。这是因为我没有在控制面板中配置“非Unicode程序的语言设置”设置。之后一切都很好。 –

相关问题