[解決済み】HTMLエンコーディングの問題 - " " の代わりに "Â" 文字が表示される。
質問
レガシーアプリの動作がおかしくなってきました。 このアプリは大量のHTMLを生成し、ActivePDFでPDFレポートに変換しています。
このような流れになります。
- 置き換えたいトークン(例:"~CompanyName~"、"~CustomerName~"など)を含むHTMLテンプレートをDBから引っ張ってきてください。
- トークンを実データに置き換える
- HTMLタグの属性値をプロパティフォーマットする簡単な正規関数でHTMLを整頓する(ActivePDFのレンダリングエンジンは属性値の周りにシングルクォート以外のものを嫌うので、クォーテーションマークなどを確実にする)。
- PDFを作成するウェブサービスにHTMLを送ります。
その混乱のどこかで、HTMLテンプレートからのノンブレーキングスペース(
がISO-8859-1としてエンコードされているため、ブラウザ(FireFox)で文書を表示すると、""文字として誤って表示されます。) ActivePDFはこれらのUTF8でない文字を吐き出してしまいます。
質問:この問題がどこから発生しているのか分からないし、それを調査する時間もないので、悪い文字を再エンコードするか、検索して置き換える簡単な方法はないでしょうか? 私が作ったこの小さな関数を通して送信してみましたが、これは <ストライク は、すべてをゴブレットグックに変えてしまう は何も変わりません。
Private Shared Function ConvertToUTF8(ByVal html As String) As String
Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
Dim source As Byte() = isoEncoding.GetBytes(html)
Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function
何かアイデアはありますか?
EDITです。
今のところ、これで何とかなっていますが、良い解決策とは到底思えません。
Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function
解決方法は?
<ブロッククオートこの混乱のどこかで、HTML テンプレートからの非改行スペース (s) が ISO-8859-1 としてエンコードされているため、それらが "♪" 文字として誤って表示されているのです。
それならISO-8859-1ではなく、UTF-8にエンコードしているはずです。ISO-8859-1では改行されていないスペースは0xA0バイトです。UTF-8にエンコードすると0xC2,0xA0となり、(間違って)ISO-8859-1とみなしてしまうと、以下のようになります。
"Â "
. このバイトには、あなたが気づいていないかもしれない末尾のnbspが含まれています。このバイトがない場合、他の何かがあなたのドキュメントを傷つけており、それを見つけるためにさらに上を見る必要があります。
正規表現、テンプレはどうなってるの?もし、あなたの
の文字列は、(正しく)U+00A0 NON-BREAKING SPACE 文字に変換されています。もしそうなら、テンプレートを DOM でネイティブに処理し、ASCII エンコーディングを使って非 ASCII 文字を文字参照として保持するようにシリアライズを依頼すればよいのです。そうすれば、常に危険なビジネスであるHTML自体の正規表現の後処理を行う必要がなくなります。
まあとにかく、今のところ、以下のいずれかをドキュメントの
<head>
を実行し、ブラウザで正しく表示されるかどうかを確認します。
-
HTML4の場合。
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-
HTML5用。
<meta charset="utf-8">
それができていれば、残った問題はActivePDFのせいです。
関連
-
[解決済み】位置固定が機能しない
-
[解決済み】iframeを水平方向にセンタリングする方法は?
-
[解決済み】このインラインブロックのdiv要素の間に説明のつかない隙間があるのはなぜですか?[重複]
-
[解決済み] text-overflow: 省略記号が機能しない
-
[解決済み] 送信ボタンが機能しない
-
[解決済み] Javaで "unmappable character for encoding "の警告が表示される。
-
[解決済み] 複数のノンブレイキングスペース("nbsp")ではなく、タブスペースを使用しますか?
-
[解決済み] 入力フィールドから属性を読み込むと、HTMLエンコーディングが失われる
-
[解決済み] Java のデフォルト文字エンコーディングの設定
-
[解決済み] " ' "の代わりに "â €™ "が表示されます。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】私のCSS3メディアクエリがモバイルデバイスで機能しないのはなぜですか?
-
[解決済み】Telegramマークダウンの構文。太字 *と* イタリック?(2018年9月)
-
[解決済み] CSS color vs. background-color vs. background?
-
[解決済み] CSS "margin: 0 auto" が中央揃えにならない
-
[解決済み] IE=edge,chrome=1というのは今でも有効なのでしょうか?
-
[解決済み] (X)HTMLにおける "PRE "タグの用途は何ですか?
-
[解決済み] 高さを固定したBootstrapパネルボディの作り方
-
[解決済み] ホバー時に背景画像を暗くする
-
[解決済み] margin-block-startとmargin-topの違いは何ですか?
-
[解決済み] <meta charset="utf-8"> vs <meta http-equiv="Content-Type">.