1

私の質問はこの未回答の質問と同じですか?

Rapidxml で Unicode XML 値を読み取る方法

しかし、XML のコンテンツは UTF-8 でエンコードされています。私は MS Visual Studio、C++ の初心者です。

私の質問は、UTF-8 文字列を wchar_t タイプの文字列に読み込むにはどうすればよいですか?

たとえば、次のような構造を定義します。

typedef struct{
    vector<int> stroke_labels;
    int stroke_count;
    wchar_t* uni_val;
}WORD_DETAIL;

そして、xmlから値を読み取るときに使用します..

WORD_DETAIL this_detail;
this_detail.uni_val=curr_word->first_node("labelDesc")->first_node("annotationDetails")->first_node("codeSequence")->value();

しかし、格納されている utf-8 文字列は期待どおりではありません。それらは破損した文字です。

私の質問は次のとおりです。

  1. Rapidxml を使用して Unicode/Utf-8 値を読み取るにはどうすればよいですか?
  2. 同じことを行う単純な xml パーサーはありますか?
  3. サンプルコードは深く感謝します。

セクション2.1では、ここで言及されています

" RapidXml はデコードを実行しないことに注意してください - name() および value() 関数によって返される文字列には、ソース ファイルと同じエンコーディングを使用してエンコードされたテキストが含まれます。 "

XML のエンコーディングが UTF-8 の場合、 ->value() 関数の戻り値を取得する最良の方法は何ですか?

前もって感謝します。

4

1 に答える 1

3

RapidXML は「その場」のパーサーであることを思い出してください。これは XML を解析し、適切な場所 (およびその他のもの) に null ターミネータを追加してコンテンツを変更します。

したがって、value()関数は実際には元のデータに char * ポインターを返すだけです。それが UTF-8 の場合、RapidXML は UTF-8 文字列へのポインタを返します。つまり、質問のタイトルで求めたことをすでに実行しています。

ただし、投稿したコード スニペットでは、a を構造体に格納したいと考えていますwchar_t。まず、メモリの所有権の問題があるため、まったく行わないことをお勧めします。C ではなく、C++ を使用することを意図していることを思い出してください。また、生のポインターを本当に格納したい場合は、既に持っている UTF-8 を使用しないでください。http://www.utf8everywhere.org/

ただし、これは Windows であるため、API 関数にワイド char 配列を渡す必要がある (リモートの) 可能性があります。その場合、OS 関数MultiByteToWideCharを使用して、UTF-8 をワイド文字に変換する必要があります。

// Get the UTF-8
char *str = xml->first_node("codeSequence")->value();

// work out the size
int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);

// allocate a vector for that size
std::vector<wchar_t> wide(size);

// do the conversion
MultiByteToWideChar(CP_UTF8, 0, str, -1, &wide[0], size);
于 2013-10-15T13:30:00.413 に答える