我尝试使用expat进行XML解析,但我在XML文件中有俄语符号,这些符号被expat错误地解释。
我得到了expired_str:Р、В、СѓСЃСЃР、С”Р、С‘Р、в“-С‚Р、В、Р、єСЃС‚
而不是:Русскийтекст
以下是我的代码片段:
static int xmlParseStartup(char *buffer, int n, START_UP_T *startUp_sp)
{
void *buff;
XML_Parser parser_p = XML_ParserCreate("UTF-8");
if (!parser_p)
{
DEBUG("Unable to create parser!\n");
return RES_ERR;
}
XML_SetUserData(parser_p, (void *)startUp_sp);
XML_SetElementHandler(parser_p, startElement, endElement);
buff = XML_GetBuffer(parser_p, n);
memcpy(buff, buffer, n);
if (XML_STATUS_ERROR == XML_ParseBuffer(parser_p, n, TRUE))
{
DEBUG("%s at line %" XML_FMT_INT_MOD "u\n",
XML_ErrorString(XML_GetErrorCode(parser_p)),
XML_GetCurrentLineNumber(parser_p));
return RES_ERR;
}
return RES_OK;
}
static void XMLCALL startElement(void *userData,
const char *name,
const char **atts)
{
int i;
START_UP_T *startUp_sp = (START_UP_T *)userData;
for (i = 0; i < startUp_sp->depthPtr; i++)
{
fprintf(stderr, ".");
}
DEBUG("[%d]name: %s\n", startUp_sp->depthPtr, name);
if (0 == strcmp(name, "response"))
{
if (0 == strcmp(atts[i], "result"))
{
startUp_sp->result = atoi(atts[3]);
DEBUG("RESULT: %d\n", startUp_sp->result);
}
else if (0 == strcmp(atts[i], "status_str"))
{
strcpy(startUp_sp->expired_str, atts[3]);
DEBUG("EXPIRED_STR: %s\n", startUp_sp->expired_str);
}
else if (0 == strcmp(atts[i], "status_width"))
{
startUp_sp->status_width = atoi(atts[3]);
}
}
startUp_sp->depthPtr += 1;
}
static void XMLCALL endElement(void *userData,
const char *name)
{
START_UP_T *startUp_sp = (START_UP_T *)userData;
startUp_sp->depthPtr -= 1;
}XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<startup>
<response name="result" value="0"/>
<response name="status_str" value="Русский текст"/>
<response name="status_width" value="120"/>
</startup>发布于 2012-12-30 03:00:40
您得到了UTF-8char*类型字符串的cp1251表示,所以expat实际上工作得很好-它是您遇到问题的控制台输出。
如果不是这样,请检查xml文件开头的utf8标记(ASCII码中的239、187、191字节,或者CP-1251中不带引号的"п>ї“)。
还有一点:你应该检查.xml文件的实际编码,看起来它不是你想的那样(utf-8)。你用什么编辑器来创建这个文件?
UTF-8“Русскийтекст”字符串的CP1251表示为"Р С_С_С_РєРёР№С'РчРєС_С'“。
https://stackoverflow.com/questions/14084872
复制相似问题