2015-01-11 4 views
1

Я ищу технику, чтобы преобразовать строку (JSON) посылается сервером, содержащим что-то вроде этого: ...."Test \u00e9\u00e9\u00e9"..... в чем-то вроде: «Тест EEE» я нашел решение : boost::replace_all(listFolder, "\\u00e9", "é"); , и я использую эту функцию повышения с другими буквами àùèê и т. Д. ... это больно!преобразования Unicode буквы с акцентами в ASCII/UTF8

Интересно, есть ли функция, которая автоматически сделала такой вид конверсии.

В противном случае, я хочу сказать вам что-то другое, то сервер будет правильно лечить строки я посылаю к нему и содержащий буквы с акцентами, если я использую эту функцию:

std::string fromLocale(std::string localeStr) 
{ 
    boost::locale::generator g; 
    g.locale_cache_enabled(true); 
    std::locale loc = g(boost::locale::util::get_system_locale()); 
    return boost::locale::conv::to_utf<char>(localeStr,loc); 
} 

, к сожалению, обратное этого кодового Бесполезный 't работать для обработки строк, отправленных сервером.

std::string toLocale(std::string utf8Str) 
{ 
    boost::locale::generator g; 
    g.locale_cache_enabled(true); 
    std::locale loc = g(boost::locale::util::get_system_locale()); 
    return boost::locale::conv::from_utf<char>(utf8Str,loc); 
} 
+0

Это не очень понятно мне, что вы просите. Взгляните на эти фрагменты для декодирования экранов JSON (Unicode): ['append_utf8' в этом примере] (http://stackoverflow.com/questions/27799086/getting-values-from-a-json-file-using- boost-property-tree-with-multiple-element/27799928 # 27799928) – sehe

+3

Читатели отмечают, что @sehe объяснил, что строка, описанная как '' Test \ u00e9 \ u00e9 \ u00e9 ", является строкой' 'Test \\ u00e9 \\ u00e9 \\ u00e9 ", т. е. \, u, 0, 0, e и 9 являются отдельными символами. –

+0

да Cheers и hth. - Альф – Aminos

ответ

1

JSON specification позволяет "\uXXXX" последовательностей для символов Unicode (amonst других \X управляющих последовательностей). Если вы не используете существующий JSON парсер, который обрабатывает декодирования таких последовательностей, вам придется декодировать их вручную, например:

// JSON uses Unicode, but is commonly encoded as UTF-8. However, Unicode 
// characters that are encoded in "\uXXXX" format are expressed as UTF-16 
// codeunit values, using surrogate pairs for codepoint values U+10000 and 
// higher. This example uses C++11's std::u16string to handle UTF-16 parsing. 
// If you are not using C++11 or later, you can replace it with std::wstring 
// on platforms where wchar_t is 16bit, for instance. If you want to handle 
// the JSON using std::string/UTF-8 instead, you will have to tweak this 
// parsing accordingly... 

std::u16string str = ...; // JSON quoted-string value, eg: "Test \u00e9\u00e9\u00e9"... 
std::u16string::size_type idx = 0; 
do 
{ 
    idx = str.find(u'\\', idx); 
    if (idx == std::u16string::npos) break; 

    std::u16string replaceStr; 
    std::u16string::size_type len = 2; 

    char16_t ch = str.at(idx+1); 
    switch (ch) 
    { 
     case u'\"': 
     case u'\\': 
     case u'/': 
      replaceStr = ch; 
      break; 

     case u'b': 
      replaceStr = u'\b'; 
      break; 

     case u'f': 
      replaceStr = u'\f'; 
      break; 

     case u'n': 
      replaceStr = u'\n'; 
      break; 

     case u'r': 
      replaceStr = u'\r'; 
      break; 

     case u't': 
      replaceStr = u'\t'; 
      break; 

     case u'u': 
     { 
      std::u16string hexStr = str.substr(idx+2, 4); 
      len += hexStr.size(); 

      std::basic_istringstream<char16_t> iss(hexStr); 
      unsigned short value; 
      iss >> std::hex >> value; 
      if (!iss) 
      { 
       // illegal value, do something 
      } 

      replaceStr = (char_t) value; 
      break; 
     } 

     default: 
      // illegal sequence, do something 
      break; 
    } 

    str.replace(idx, len, replaceStr); 
    idx += replaceStr.size(); 
} 
while (true); 
Смежные вопросы