0

重複の可能性:
C で HTML エンティティをデコードする方法は?

この質問はその質問と非常に似てますが、python ではなく C で同じことを行う必要があります。関数が何をすべきかの例を次に示します。

input    output

&lt;     <
&gt;     >
&auml;   ä
&#x00DF; ß

この関数には、char *html2str(char *html) などの署名が必要です。ストリームからバイト単位で読み取っていません。

使用できるライブラリ関数はありますか?

4

2 に答える 2

2

仕事をするための標準ライブラリ関数はありません。オープン ソースの世界では、多数の実装が利用可能である必要があります。HTML を処理する必要があるほぼすべてのプログラムには実装があります。

この問題には 2 つの側面があります。

  1. ソース文字列で HTML エンティティを検索します。
  2. その場所に適切な置換テキストを挿入します。

可能な限り短いエンティティは「&x;」であるため (しかし、知る限り、それらはすべてアンパサンドとセミコロンの間に少なくとも 2 文字を使用します)、可能な限り最長の UTF-8 文字表現は 4 バイトであるため、常に文字列を短縮します。そのため、その場で安全に編集することができます。

Kernighan と Pike による「 The Practice of Programming 」に HTML エンティティのデコードの図がありますが、多少「通りすがり」に行われています。トークナイザーを使用してエンティティを認識し、バイナリ検索を使用して置換を識別できるように、エンティティ名と置換値の並べ替えられたテーブルを使用します。これは、非アルゴリズム エンティティ名にのみ必要です。「ß」としてエンコードされたエンティティについては、アルゴリズム技術を使用してデコードします。

于 2009-11-03T15:55:19.387 に答える
0

これは の仕事のようですねflex。確かに、flex は通常ストリームベースですが、flex 関数yy_scan_string(またはその関連関数) を使用して変更できます。詳細については、The flex マニュアル: 文字列のスキャンを参照してください。

Flex の基本的な Unicode サポートはかなり悪いですが、手動でバイトをコーディングすることを気にしないのであれば、回避策になる可能性があります。あなたが望むことを行うことができる他のツールもおそらくあるでしょう。

于 2009-11-03T15:45:17.643 に答える