0

Raptor RDF ライブラリを使用して rdf-xml ファイル (UTF-8 エンコード) を解析するプログラム (c++、Windows) を作成しています。パーサーが特殊文字 ('µ' '°' '²' など) を含むリテラル値を検出した場合を除いて、すべて正常に行われます。このような場合、パーサーは解釈されていない文字列を返します。たとえば、パーサーがリテラル値を見つけた場合:

ブラブラ

以下を含む文字タブを返します。

「ブラ\u00B5ブラ」

(引用符はエラーではありません。返される文字列' " ' で囲まれます)。

この文字列は解釈されないと言います。コードに直接記述した場合、期待される結果が得られるためです。

std::string test("bla\u00B5bla"); printf(test.c_str());

出力:

ブラブラ

Raptor パーサーによって返された文字列を再現したい場合は、次のようにする必要があります。

std::string test("\"bla\\u00B5bla\""); printf(test.c_str());

出力:

「ブラ\u00B5ブラ」

だから、私の質問は次のとおりです。文字列内の特殊文字を再解釈する方法は? 私はいくつかの調査を行いましたが、これに答えるものは何も見つかりませんでした。どんな助けでも非常に役に立ち、感謝します。

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 であると仮定) :

「ブラ\u00B5ブラ」

私の目標は、そこから元の正しい文字列を回復することだけです。

4

1 に答える 1

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;
}
于 2013-06-04T09:44:03.277 に答える