我正在编写一个程序(c ++,Windows),它使用Raptor RDF librairies解析rdf-xml文件(UTF-8编码)。 一切都很好,除非解析器找到包含特殊字符的文字值(例如'μ''°'''等)。在这些情况下,解析器返回非解释字符串。 例如,如果解析器找到文字值:
blaμbla
它将返回一个包含以下内容的char选项卡:
“BLA \ u00B5bla”
(引号不是错误,返回的字符串 由'“'代表。)
我说这个字符串是非解释的,因为如果我直接在我的代码中编写它,我将得到预期的结果:
std::string test("bla\u00B5bla"); printf(test.c_str());
输出:
blaμbla
如果我想重现Raptor解析器返回的字符串,我应该这样做:
std::string test("\"bla\\u00B5bla\""); printf(test.c_str());
输出:
“BLA \ u00B5bla”
所以,我的问题是:如何重新解释字符串中的特殊字符? 我做了一些研究,但我找不到任何答案。 任何帮助都非常有用和赞赏,谢谢。
EDIT1: 这里有一些简化的代码显示我如何得到'非解释'字符串:
void triple_handler(void* user_data, raptor_statement* triple) {
if (triple->object->type == RAPTOR_TERM_TYPE_LITERAL){
printf((char*) raptor_term_to_string(triple->object));
}
}
输出(假设文件中的原始文字值为:blaμbla):
“BLA \ u00B5bla”
我的目标只是从中恢复原始正确的字符串。
答案 0 :(得分:0)
如果没有其他方法可以要求库输出Unicode字符串,或者根据当前字符集等转换Unicode字符
或者你可以做这样的事情(只是伪代码,也许是错误的,只是给你一些提示,你可以自己将字符串转换为wstring ):
wstring foo(string in_src)
{
wstring out = L"";
for (auto i = in_src.begin(), e = in_src.end(); i != e;)
{
if (*i != '\\')
{
out += (wchar_t)*i;
++i;
}
else
{
if (e - i > 1 && *(i + 1) == '\\')
{
out += L'\\';
i += 2;
}
else if (e - i > 4)
{
wchar_t c;
if (convert_next_4_chars_as_hex_number_by_whatever_means(i + 1, c))
{
out += c;
i += 5;
}
else
{
throw some_error;
}
}
else
{
throw some_error;
}
}
}
return out;
}