web-dev-qa-db-ja.com

HTMLエンコードの問題 - " "の代わりに "Â"文字が表示される

私は確信が持てないどんな理由のためにでも、単に不正な動作をし始めているレガシーアプリを持っています。これは、ActivePDFによってPDFレポートに変換される一連のHTMLを生成します。

プロセスは次のように機能します。

  1. トークンを含むHTMLテンプレートを取り替えるためにDBから取得します(例: "〜CompanyName〜"、 "〜CustomerName〜"など)。
  2. トークンを実際のデータに置き換えます
  3. HTMLタグの属性値をプロパティフォーマットする単純な正規表現関数を使ってHTMLを整理します(ActivePDFのレンダリングエンジンは属性値を囲む一重引用符以外は嫌いなので引用符などを確実にします)。
  4. PDFを作成するWebサービスにHTMLを送ります。

その混乱のどこかで、HTMLテンプレートからの切れ目のないスペース( s)はISO-8859-1としてエンコードされているため、ブラウザ(FireFox)でドキュメントを表示するときに誤って "Â"文字として表示されます。 ActivePDFはこれらの非UTF-8文字をプックします。

私の質問:問題の原因がどこにあるのかわからないし、調査する時間がないので、悪い文字を再エンコードしたり見つけたり置き換えたりする簡単な方法はありますか。私は一緒に投げたこの小さな機能を通してそれを送ろうとしました、しかしそれは それをすべてgobbledegookに変える 何も変わらない。

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

何か案は?

編集:

私は今のところこれでやっています、それは良い解決策のようにはほとんど見えませんが:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function
191
Cᴏʀʏ

その混乱のどこかで、HTMLテンプレートからの切れ目のないスペースはISO-8859-1としてエンコードされているので、それらは "Â"文字として誤って表示されます。

その場合はISO-8859-1ではなく、UTF-8にエンコードします。非改行スペース文字は、ISO-8859-1のバイト0xA0です。 UTF-8にエンコードされている場合は0xC2,0xA0になります。これを(誤って)ISO-8859-1と見なした場合、" "と表示されます。それはあなたが気づいていないかもしれない末尾のnbspを含みます。そのバイトが存在しない場合は、何か他のものがあなたの文書を壊しているので、さらに調べるためにさらに調べる必要があります。

正規表現とは何ですか、テンプレートはどのように機能しますか?もしあなたの 文字列が(正しく)U + 00A0ノンブレイクスペース文字に変換されているなら、どこかに適切なHTMLパーサが関与しているように思われるでしょう。もしそうなら、あなたはDOMでネイティブにあなたのテンプレートを処理し、文字参照として非ASCII文字を保つためにASCIIエンコーディングを使って直列化するようにそれに頼むことができます。これはまた、HTML自体に正規表現の後処理をしなければならなくなることを防ぎます。

とにかく、とりあえず今のところあなたのドキュメントの<head>に以下のいずれかを追加して、それがブラウザで正しく見えるかどうかを確かめてください:

  • hTML4の場合:<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • hTML5の場合:<meta charset="utf-8">

あなたがそれをやったならば、それから残りの問題はActivePDFのせいです。

324
bobince

誰かが私と同じ問題を抱えていて、文字セットがすでに正しい場合は、単にこれを行います。

  1. .htmlファイル内のすべてのコードをコピーします。
  2. メモ帳(または基本的なテキストエディタ)を開いてコードを貼り付けます。
  3. [ファイル] - > [名前を付けて保存]をクリックします。
  4. ファイル名 "example.html"を入力します([ファイルの種類:すべてのファイル()]を選択します))
  5. UTF-8としてエンコードを選択
  6. [保存]をクリックすると、古い.htmlファイルを削除できます。エンコードは修正されるはずです。
23
Low

問題:私たちがCRMシステムへのPOSTリクエストに何らかの文字列を含む '£'を送信するという問題に直面していましたしかし、CRMからGET呼び出しを実行していたときは、文字列の内容と共に 'Â'が返されていました。つまり、 '£' '£に変換されています。

分析:調査の結果判明した不具合は、POST callでHttpWebRequestContentTypeを "text/xml"に設定したことですGET Call中は "text/xml; charset:utf-8"でした。

解決策:解決策の一部として、POST requestに文字セット:utf-8を含めて動作します。

11