HTML编码问题 - "Â"字符显示而不是" "

Cᴏʀ*_*ᴏʀʏ 197 html vb.net encoding utf-8 iso-8859-1

我有一个遗留应用程序只是开始行为不端,无论出于何种原因我不确定.它会生成一堆HTML,并由ActivePDF转换为PDF报告.

这个过程是这样的:

  1. 从DB中提取HTML模板,其中包含令牌(例如"~CompanyName~","~CustomerName~"等).
  2. 用真实数据替换令牌
  3. 使用简单的正则表达式函数整理HTML,该函数可以格式化HTML标记属性值(确保引号等,因为ActivePDF的渲染引擎只讨论属性值周围的单引号)
  4. 将HTML发送到创建PDF的Web服务.

在那个混乱的地方,HTML模板( s)中的不间断空格编码为ISO-8859-1,因此在浏览器(FireFox)中查看文档时它们会错误地显示为"Â"字符.ActivePDF会对这些非UTF8字符产生影响.

我的问题:既然我不知道问题出在哪里,也没有时间去研究它,是否有一种简单的方法可以重新编码或找到并替换坏字符?我已经尝试通过我扔在一起的这个小功能发送它,但它把它变成了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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:

我现在正在接受这个,虽然它似乎不是一个好的解决方案:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 329

在那个烂摊子的某个地方,HTML模板(s)中的不间断空格编码为ISO-8859-1,因此它们不正确地显示为"Â"字符

那就是编码为UTF-8,而不是ISO-8859-1.非中断空格字符是ISO-8859-1中的字节0xA0; 当编码为UTF-8时,它是0xC2,0xA0,如果您(错误地)将其视为ISO-8859-1,则表示为" ".这包括你可能没有注意到的结尾; 如果那个字节不存在,那么其他东西已经破坏了你的文档,我们需要进一步了解你的内容.

什么是正则表达式,模板是如何工作的?如果您的 字符串(正确地)被转换为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的错误.

  • 我不推荐`<meta charset ="utf-8">`.`http-equiv`版本在HTML5中仍然有效,并且得到更好的支持. (18认同)
  • 来自[使用哪一个:<meta charset ='utf-8'> vs <meta http-equiv ='Content-Type']的答案(http://stackoverflow.com/questions/4696499/which-one-to- use-meta-charset-utf-8-vs-meta-http-equiv-content-type)表明短版本得到了很好的支持. (7认同)
  • "在那个烂摊子的某个地方"......哈哈!好开!好答案!+1 (3认同)

Low*_*Low 24

如果任何人遇到与我相同的问题且charset已经正确,只需执行以下操作:

  1. 复制.html文件中的所有代码.
  2. 打开记事本(或任何基本文本编辑器)并粘贴代码.
  3. 去"文件 - >另存为"
  4. 输入文件名"example.html"(选择"另存为类型:所有文件(.)")
  5. 选择编码为UTF-8
  6. 点击保存,您现在可以删除旧的.html文件,并且应该修复编码

  • 这样做对我来说.现在在崇高中,它说"UTF-8与BOM"而不是"UTF-8".要在sublime文本中看到这一点,你需要在设置 - 用户中将`show_encoding`设置为`true`. (2认同)

Him*_*iya 11

问题: 即使我遇到了问题,我们在CRM系统的POST请求中发送了一些带有字符串的'£',但是当我们从CRM进行GET调用时,它返回带有一些字符串内容的'£'.所以我们分析的是'£'被转换为'£'.

分析: 我们在研究之后发现的故障是在POST调用中我们将HttpWebRequest ContentType设置为"text/xml",而在GET Call中它是"text/xml; charset:utf-8".

解决方案: 作为解决方案的一部分,我们在POST请求中包含了charset:utf-8,它可以工作.