我现在正在尝试解析Chrome书签,但我遇到了问题。书签摘录如下:
{
"date_added": "12915566290018721",
"id": "16",
"name": "hao123\uFF0D\uFF0D\u6211\u7684\u4E0A\u7F51\u4E3B\u9875",
"type": "url",
"url": "http://www.hao123.com/"
}
对应于name字段的字符串编码存储为“hao123 \ uFF0D \ uFF0D \ u6211 \ u684 \ u4E0A \ u7F51 \ u4E3B \ u9875”,但它应该是“hao123--我的上网主页”提供给用户。如何将“hao123 \ uFF0D \ uFF0D \ u6211 \ u684 \ u4E0A \ u7F51 \ u4E3B \ u9875”转换为“hao123--我的上网主页”?
thanks!
答案 0 :(得分:2)
您可以尝试此代码
strace.exe
答案 1 :(得分:1)
您正在查看的是字符串中的UTF-16代码点。除非您有一个为您处理Unicode的JSON库,否则请考虑迭代字符串并查找表示UTF-16代码点“\ u”的转义序列。从那里你可以将字符串转换为正确输出所需的任何编码。
答案 2 :(得分:1)
谢谢codeka,我解决了这个问题。
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&amp; fbrereto再次。
答案 3 :(得分:0)
据我所知,Jsoncpp source code看起来它应该正确解码字符串,你会得到一个UTF-8字符串。如果那不是您所看到的,请发布您实际使用的代码,以及您要取回的内容。
答案 4 :(得分:0)
向上是工作。这是我的代码。
#!/usr/bin/env perl
my $desc = do { local $/ = undef; <> };
$desc .= "\n===="; # set the end marker
while($desc =~ /^==== (?<filename>.*?)#.*?====$(?<content>.*?)(?=^====)/mgsp) {
print "filename=", $+{filename}, "\n";
print "content=", $+{content}, "\n";
}
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());
}
}