2

HTML 文字列を解析し、クエリを実行していくつかのノードを取得し、これらのノードの HTML を出力するメソッドを作成しています。

私はlibxmlを使用しており、入力 HTML を読み込んで解析し、必要なノードの HTML 文字列を出力することができました。文字。

これまでに得たものは次のとおりです(コードはObjective-Cプロジェクトの一部です):

NSString *HTMLString = ...
NSData *documentData = [HTMLString dataUsingEncoding:NSUTF8StringEncoding];

//Create the document
xmlDocPtr doc = htmlReadMemory([documentData bytes],
                               [documentData length],
                               "",
                               NULL,
                               HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);

//Get the node I want to output
xmlNodePtr node = ...

//Create the node buffer and fill it with the node content
xmlBufferPtr nodeBuffer = xmlBufferCreate();
htmlNodeDump(nodeBuffer, doc, node);

...

これにより、ノードの HTML コンテンツが正常にダンプされますが、文字エンティティは UTF-8 文字に変換されます。入力 HTML に存在する唯一のエンティティは、ノードの HTML を書き出すときに保持したい’andなどの引用符です。‘コンテンツ。

HTML 解析と HTML ツリー関数に関連する libxml ドキュメントを調べましたが、HTML エンティティに関する情報が見つからないようです。これが解析中に行われるものなのか、出力中に行われるものなのかもわかりません。を使用してノードのコンテンツを単純に出力しようとしましたがxmlNodeGetContent()、エンティティも対応する UTF8 文字に置き換えられていたため、解析の問題であると思われますが、よくわかりません。

4

1 に答える 1

3

問題は、libxml が内部で UTF-8 (xmlsoft の エンコーディング サポートで説明) で動作し、すべての HTML 文字エンティティを UTF-8 文字に変換するため、HTML を出力するときにこれらが変換された UTF-8 のままになることが判明しました。文字。

このソリューションは、xmlsoft のエンコーディング セクションの「デフォルトでサポートされているエンコーディング」にも示されています。

libxml2 には、次のエンコーディング用のデフォルト コンバーターのセットがあります (encoding.c にあります)。

  1. UTF-8 はデフォルトでサポートされています (null ハンドラー)
  2. UTF-16、リトルエンディアンとビッグエンディアンの両方
  3. ほとんどの西洋言語をカバーする ISO-Latin-1 (ISO-8859-1)
  4. ASCII、主に保存に役立ちます
  5. © などの HTML 定義済みエンティティを使用して、UTF-8 を ASCII に変換するための特定のハンドラである HTML。著作権記号について。

またUTF8Toisolat1、libxml 関数から返された値を別のエンコーディングに変換するには、変換関数「like」を使用することをお勧めします。

UTF8ToHtml()解決策は、非 ASCII 文字を関連する HTML エンティティ ( や など) に置き換える関数を&rsquo;使用して HTML 出力を変換すること&lsquo;です。で試したときとは異なり、これは HTML タグ<と文字を手付かずのままにしているようです。>htmlEncodeEntities()&lt;&gt;

使用時に解決しなかったことの 1 つUTF8ToHtml()は、出力バッファーに割り当てるメモリの量を決定する方法でした。単一の文字をエンティティに置き換えると HTML 文字列の長さが増加するため、入力 HTML の長さだけを使用することはできません。 . 入力バッファの 2 倍のサイズを単純に割り当て (これですべてのユースケースに十分なはずです)、実際に使用された長さを使用しました (ポインタ パラメータを介して返されますUTF8ToHtml())。これを行う方法。

于 2012-04-08T15:42:54.203 に答える