8

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

これが私の質問です。これを修正する最も簡単な方法は何ですか? すべてのページを開いて、その文字を従来のアポストロフィに置き換える必要がありますか? または、エンコーディングの問題を上書きまたは修正する可能性のある (たとえば、IIS に) 追加できる簡単な修正はありますか? または、ブルートフォース検索/置換する必要がありますか? 私はこれらの Web サイトに何百ものページを持っていますが、変更する必要があるページの数がわからないので、この問題を回避するか、すぐに修正できる方法を誰かが知っていれば、それを感謝します.

4

4 に答える 4

2

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

そのままの HTML を提供している場合は、実際にファイル自体を変更する必要があります。ただし、これは自動化できます(おそらく何百ものファイルがある場合)、使用できるツールと使用しているオペレーティングシステムによって異なります。Notepad ++を使用していると言ったので、想定しても安全だと思いますあなたはMS Windowsを使用しています(したがって、速度を上げるための楽しいUnixコマンドはありません)

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

于 2010-09-30T17:51:07.277 に答える
1

エンコーディング部分については私自身よくわかりませんが、力ずくでそれをしなければならない場合は、すべての Web ページを反復処理し、各ファイルをメモリにロードし、 regex.replace を使用して問題の文字を修正し、ファイルをディスクに保存します。明らかに理想的ではありませんが、各ファイルを自分で開くよりはましです。

幸運を

于 2010-09-30T17:47:48.303 に答える
1

スペースを分割しない「xA0」がUTF-8ドキュメントに入るという同様の問題に遭遇しました。notepad++ では、これらは「xA0」と書かれた黒いボックスに表示されます。ただし、notepad++ では、それらをコピーまたは貼り付けることはできません。

私は少し調査を行い、何が起こっているのかを知りました。16 進エディタは、これらが無効な UTF-8 である "A0" という 1 バイトとしてエンコードされていることを明らかにします。ASCII 以外のものは少なくとも 2 バイトである必要があるため、適切なエンコードは 16 進数の「C2 A0」です。

派手なアポストロフィの例では、同じことを扱っています。実際には、拡張 ascii 文字 \x92 (10 進数 146) ではアポストロフィですが、Unicode では \x92 は制御文字であり、右の一重引用符は U+2019 (10 進数 8217) である必要があるため、問題はより複雑です。この記号をメモ帳 ++ に追加し ([編集] -> [文字] パネルを介して)、16 進エディタで調べると、適切な 16 進エンコーディングは "E2 80 99" であり、バイナリでは 1110 0010 10 000000 10 011001であることがわかります。UTF-8 制御バイト (太字ではない) を削除すると、0010 0000 0000 0001 1001 となり、10 進値の 8217 に相当します。

これを処理する適切な方法は、ファイルをバイト ストリーム (c では​​ unsigned char *) として開き、不適切な UTF-8 シーケンスを検索することです。次に、それらを � ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequencesを参照) に置き換えるか、A0 -> C2 A0 (不適切にエンコードされた非区切りスペース) および 92 -> E2 80 99 (不適切にエンコードされた右の単一引用符)。

于 2016-08-26T19:52:37.347 に答える
0

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

©

HTML エンティティ リスト:

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

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

Server.HTMLEncode("string with special chars")
于 2010-09-30T17:50:33.287 に答える