異なるエンコーディングで提供されるページ内の無効な HTML 文字を修正するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3833300

質問

無効な文字を表示する Web サイトが多数あります。ページのメタタグは UTF-8 エンコーディングを指定します。ただし、多くのページには UTF-8 で解釈できない文字が含まれています。これは、ファイルが別のエンコード (ANSI など) で保存されたためと考えられます。私が今特に懸念しているのは、派手なアポストロフィ (「」のような) です。ボブの「...正しく表示されなかったらごめんなさい)。W3 のバリデーターは、エンティティが「」であることを示しています。\x92」とありますが、Unicode にマップされていないため、ファイルは検証されません。そしてもちろん、ファイルを Notepad++ で開き、エンコードを UTF-8 に変更すると、文字はブラック ボックス内の 92 に置き換えられます。

私の質問は次のとおりです。これを修正する最も簡単な方法は何ですか?すべてのページを開いて、その文字を従来のアポストロフィに置き換える必要がありますか?それとも、エンコードの問題をオーバーライドしたり修正したりできる (たとえば IIS に) 追加できる簡単な修正はありますか?それとも総当たりで検索/置換する必要がありますか?これらの Web サイトには何百ものページがあり、そのうちの何ページを変更する必要があるか見当がつきません。そのため、この問題を回避するか、すぐに修正できる方法を知っている人がいたら、よろしくお願いします。

役に立ちましたか?

解決

ページをそのままの HTML として提供していますか? それともコンテンツを提供する別のスクリプトがありますか?コンテンツを提供するスクリプトがある場合、そのスクリプトは \x92 のインスタンスを検索し、それをアポストロフィに置き換えることができます。PHP では、これは単純な str_replace() になります。

そのままの HTML を提供している場合は、実際にファイル自体を変更する必要があります。ただし、使用できるツールと使用しているオペレーティング システムに応じて、これは自動化できます (ファイルが数百ある場合は自動化する必要があるでしょう)。Notepad++ を使用しているとのことなので、MS Windows を使用していると考えて間違いありません (したがって、速度を上げるための楽しい Unix コマンドはありません)。

ただし、これを実行できる BATCH スクリプトを作成できる場合があります。コマンド プロンプトには、非常にシンプルな ASCII テキスト編集ツールが組み込まれています。それが不可能な場合でも、システムにコンパイラがあり、C に関するある程度の知識があれば、これを行う C または C++ プログラムを作成することは非常に可能です。前者は持っていて後者は持っていない場合は、質問してください。情報源を用意します。

他のヒント

エンコード部分については自分でもよくわかりませんが、総当たりでエンコードする必要がある場合は、すべての Web ページを反復処理し、各ファイルをメモリにロードし、 regex.replace を使用して問題の文字を修正し、ファイルをディスクに保存し直します。明らかに理想的ではありませんが、各ファイルを自分で開くよりは良いでしょう。

幸運を

私はちょうど、スペースを区切っていない「xA0」がおそらく UTF-8 ドキュメントに入り込むという同様の問題に遭遇しました。notepad++ では、これらは「xA0」と書かれた黒いボックス内に表示されます。ただし、notepad++ ではコピーやペーストができません。

少し調べてみたところ、何が起こっているのかが分かりました。16 進数エディタでは、これらが単一バイトとしてエンコードされていることがわかります。「A0」は無効な UTF-8 です。ASCII 以外の文字列は少なくとも 2 バイトである必要があるため、適切なエンコードは 16 進数の「C2 A0」です。

派手なアポストロフィの例では、同じことを扱っています。ただし、実際には、拡張 ASCII 文字 \x92 (10 進数 146) はアポストロフィですが、Unicode では \x92 は制御文字であり、右側の一重引用符は U+2019 (10 進数 8217) である必要があるため、問題はより複雑です。このシンボルを notepad++ ([編集]->[文字] パネル経由) に追加し、16 進数エディターで検査すると、適切な 16 進数のエンコーディングが「E2 80 99」であり、バイナリでは 1110 であることがわかります。0010 10000000 10011001. 。UTF-8 制御バイト (太字以外) を削除すると、10 進数値の 8217 に等しい 0010 0000 0000 0001 1001 が生成されます。

これを処理する適切な方法は、ファイルをバイト ストリーム (c の unsigned char *) として開き、不適切な UTF-8 シーケンスを検索することです。その後、それらを � に置き換えることもできます (「 https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences) または、A0 -> C2 A0 (不適切にエンコードされた非改行スペース) や 92 -> E2 80 99 (不適切にエンコードされた右一重引用符) のような置換を行うことで、カスタム処理を試みることもできます。

すべての特殊文字は HTML エンコードする必要があります。著作権記号は HTML に次のように含める必要があります。

©

HTML エンティティ リスト:

http://www.w3schools.com/HTML/html_entities.asp

これをどのように実装するかについては、最初にコードをどのように作成するかによって大きく異なりますが、ASP.Net のようなものには次のようなサーバー側の機能があります。

Server.HTMLEncode("string with special chars")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top