2010-04-12 7 views
3

Теперь я пытаюсь разобрать хромированные закладки, но я столкнулся с проблемой. закладки фрагмент кода представлена ​​следующим образом:Как я могу справиться с этой кодировкой?

{ 
     "date_added": "12915566290018721", 
     "id": "16", 
     "name": "hao123\uFF0D\uFF0D\u6211\u7684\u4E0A\u7F51\u4E3B\u9875", 
     "type": "url", 
     "url": "http://www.hao123.com/" 
    } 

строка кодирования, соответствующее поле имя хранится как "hao123 \ uFF0D \ uFF0D \ u6211 \ u7684 \ u4E0A \ u7F51 \ u4E3B \ u9875", но оно должно быть " hao123-- 我 的 上网 主页 ", чтобы предоставить пользователям. Как я могу преобразовать «hao123 \ uFF0D \ uFF0D \ u6211 \ u7684 \ u4E0A \ u7F51 \ u4E3B \ u9875" в "hao123-- 我 的 上网 主页"?

thanks! 
+0

Что вы используете для разбора JSON? Если вы используете Javascript напрямую, тогда он должен «просто работать». Если вы используете какую-либо другую библиотеку, тогда вам нужно сообщить нам, какой из них. –

+0

Я использую Jsoncpp для его анализа. – Dan

+0

Кто бы ни заходил в эту закладку, рекомендую восстановить их браузер и, возможно, сбросить все настройки, потому что hao123 имеет тенденцию устанавливать себя без согласия пользователя, как побочный продукт установки другого программного обеспечения, включая многие связанные с BaiDu продукты. Он обычно вводит себя как страницу по умолчанию во время открытия, как домашнюю страницу, как панель инструментов и многое другое. – Domi

ответ

0

Насколько я могу судить, глядя на Jsoncpp source code, похоже, что он должен правильно декодировать строку, и вы получите строку UTF-8. Если это не то, что вы видите, отправьте код, который вы используете, и что вы получаете обратно.

+0

Вы правы, мой код: std :: ifstream infile ("Закладки"); Json :: Value root; Json :: Reader reader; bool ok = reader.parse (infile, root); если (! Ok) { возвращение; } \t std :: string name = root.get ("name", "").AsString(); \t cout << name << endl; Когда я вывожу его в файл, откройте его в VIM, результат: hao123 锛 嶏 紞 鎴 戠 殑 涓 婄 綉 涓 婚> , но если я открою его в слове Microsoft, это помогло мне выбрать кодировку UTF8 и получить правильный ответ. Поэтому я считаю, что это кодировка UTF8. – Dan

+0

Итак, я пробую этот код, но он не получил правильного ответа, почему: \t std :: string name = root.get ("name", ""). AsString(); \t cout << name << endl; \t int len ​​= strlen (name.c_str()) + 1; \t WCHAR outName [MAX_PATH]; \t MultiByteToWideChar (CP_UTF8, 0, name.c_str(), len, outName, len); wcout << outName << endl; – Dan

1

Что вы ищете, это кодовые точки UTF-16 в строке. Если у вас нет библиотеки JSON, которая обрабатывает Unicode для вас, рассмотрите итерацию строки и поиск escape-последовательности, которая обозначает кодовую точку UTF-16 «\ u». Оттуда вы можете преобразовать строку в любую кодировку, необходимую для правильного вывода.

+0

Спасибо! Я использую Jsoncpp для его анализа и получения строки std :: C++, но я не знаю, как ее преобразовать. Это любая функция, например MultiByteToWideChar? – Dan

+0

Может ли кто-нибудь сказать мне, как преобразовать поле имени как std :: string в wchar_t? или предоставить мне соответствующие материалы. благодаря! – Dan

1

Спасибо, Кодка, я решаю проблему.

std::string name = root.get("name","").asString(); 
cout<<name<<endl; 

int len=strlen(name.c_str())+1; 
WCHAR outName[MAX_PATH]; 
// MultiByteToWideChar(CP_UTF8, 0, name.c_str(), len, outName, len); 


char outch[MAX_PATH]; 
WCHAR * wChar=new WCHAR[len]; 
wChar[0]=0; 
MultiByteToWideChar(CP_UTF8, 0, name.c_str(), len, wChar, len); 
WideCharToMultiByte(CP_ACP, 0, wChar, len, outch , len, 0, 0); 
delete [] wChar; 




    cout<<outch<<endl; 

Благодаря codeka & fbrereto снова.

+0

Это сработало для меня. – conectionist

2

Вы можете попробовать этот код

std::string name = root.get("name","").asString(); 

    USES_CONVERSION; 

    std::wstring wstr_name(A2W_CP(name.c_str(), CP_UTF8)); 
0

Up работа. Вот мой код.

 Json::Reader reader; 
 
     Json::Value root; 
 
     if (reader.parse(response, root)) 
 
     { 
 
      if (root.isMember("data")&& root.isMember("msg")) 
 
      { 
 
       Json::Value data = root["data"]; 
 
       std::string str = root["msg"].asCString(); 
 
       std::string cstr = UnicodeToGB2312(str); 
 
       AndroidSay("%s", cstr.c_str()); 
 
      } 
 
     }

string UnicodeToGB2312(std::string uData) 
 
{ 
 
    int len = strlen(uData.c_str()) + 1; 
 
    char outch[MAX_PATH]; 
 
    WCHAR * wChar = new WCHAR[len]; 
 
    wChar[0] = 0; 
 
    MultiByteToWideChar(CP_UTF8, 0, uData.c_str(), len, wChar, len); 
 
    WideCharToMultiByte(CP_ACP, 0, wChar, len, outch, len, 0, 0); 
 
    delete[] wChar; 
 
    char* pchar = (char*)outch; 
 
    return pchar; 
 
}