2016-03-02 249 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程序的語言設置」設置。之後一切都很好。 –

相關問題