0

XML解析にexpatを使用しようとしましたが、XMLファイルにロシア語の記号があります。この記号はexpatによって誤って解釈されます。

私はexpired_strを取得しました:РВСѓСЃСЃРС”РС'Рв„ –текст</ p>

代わりに:Русскийтекст

これが私のカットされたコードです:

    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>
4

1 に答える 1

1

UTF-8 char* 型の文字列の cp1251 表現を取得するため、expat は実際には正常に動作します。これは、問題が発生しているコンソール出力です。

そうでない場合は、xml ファイルの先頭にある utf8 マーカーを確認します (ASCII コードで 239、187、191 バイト、または CP-1251 では引用符なしの「п>ї」)。

もう 1 つ: .xml ファイルの実際のエンコーディングを確認する必要があります。ファイルの作成に使用するエディターは何ですか?

UTF-8 "Русский текст" 文字列の CP1251 表現は "Р С_С_С_РєРёР№ С'РчРєС_С'" です。

于 2012-12-29T19:00:39.727 に答える