2016-03-02 3 views
3

Я прочитал всю документацию jsoncpp here, и я знаю, как использовать jsoncpp для char * и std :: string, но мне нужен способ получить wchar данные из мой json-файл. Я предполагаю, что это можно сделать с помощью функции decodeString, присутствующей в json_reader.cpp. Документация не описывает, является ли токен параметром или параметром out или как именно я должен получить этот токен, учитывая его параметр [in]. Я искал более двух дней, и я не могу найти лидерство.Как использовать decodeString в jsoncpp для декодирования строки, содержащей символы 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. Но текст записывается как: wütend, когда он действительно должен быть wütend. Следовательно, мне нужен wchar. –

+0

'ü' в utf8 является байтовой последовательностью' C3 BC'. Таким образом, это 'ü', когда кодируется как ascii. Как вы читаете этот .dat-файл? Думаю, ваш зритель использует кодировку ascii, что не очень хорошо при работе с unicode. – deniss

ответ

1

В Windows используется стандарт UTF16 UNICODE. Новые проекты Windows должны быть настроены с настройками UNICODE.

Системы на базе Linux и интернет-сети используют стандарт UTF8.

Вы получаете данные через json, это, вероятно, в UTF8, доступный как std::string или const 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); 

преобразовать его обратно в UTF8 перед его отправкой в ​​формате JSON:

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

Barmak, большое вам спасибо за ваше объяснение, но я как бы застрял в использовании MultiByteToWideChar в Windows XP. Вышеприведенный код работает отлично на Vista и выше, но на XP я просто получаю блоки вместо фактических данных. –

+0

Ошибка XP может быть от JSON, или, может быть, от 'MultiByteToWideChar', но я не могу догадаться, что происходит. –

+0

Я понял, почему он не работал на XP. Это произошло из-за того, что я не настроил настройку «Настройка языка для программ, отличных от Юникода» на панели управления. После этого все отлично справилось. –

 Смежные вопросы

  • Нет связанных вопросов^_^