HTML编码问题-出现“字符而不是” ;“

HTML编码问题-出现“字符而不是” ;“

我有一个遗留的应用程序刚刚开始不正常行为,无论什么原因,我不确定。它生成一组HTML,由ActivePDF将其转化为PDF报告。

这个过程是这样的:

  1. 从含有待替换标记的DB中提取HTML模板(例如“~CompanyName~”、“~CustomerName~”等)
  2. 用实际数据替换令牌
  3. 用一个简单的regex函数整理HTML,该函数属性格式化HTML标记属性值(确保引号等,因为ActivePDF的呈现引擎讨厌属性值周围的单引号)
  4. 将HTML发送到创建PDF的Web服务。

在这个混乱的地方,HTML模板中的不间断空间( s)编码为ISO-8859-1,因此在浏览器(Firefox)中查看文档时,它们会错误地显示为“字符。ActivePDF会吐出这些非UTF 8字符。

我的问题是:既然我不知道问题出在哪里,也没有时间去调查它,那么是否有一种简单的方法来重新编码或者找到并替换坏角色呢?我试过通过这个小功能把它发送出去,但是把这一切都变成了狼吞虎咽不会改变什么。

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


慕姐4208626
浏览 390回答 3
3回答

茅侃侃

在这种混乱的地方,HTML模板中的不间断空格编码为iso-8859-1,因此它们被错误地显示为“字符。那就是编码到UTF-8,而不是ISO-8859-1。在iso-8859-1中,不中断的空格字符是字节0xA0;当编码到utf-8时,它将是0xC2,0xA0,如果(不正确地)将其视为ISO-8859-1,则如下所示:"Â&nbsp;"..这包括一个可能没有注意到的跟踪nbsp;如果这个字节不存在,那么您的文档中就会有其他东西损坏,我们需要进一步查看以找出具体内容。什么是regexp,模板是如何工作的?如果您的&nbsp;字符串被(正确地)转换为U+00A0非破缺空格字符。如果是这样的话,您可以在DOM中本机处理模板,并要求它使用ASCII编码序列化,以保持非ASCII字符作为字符引用。这也将使您不必对HTML本身进行regex后处理,因为HTML本身一直是一项非常不可靠的业务。无论如何,现在您可以在文档中添加以下内容之一<head>看看这是否使它在浏览器中看起来正确:对于HTML 4:<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />对于HTML 5:<meta charset="utf-8">如果您已经这样做了,那么剩下的任何问题都是ActivePDF的错。

手掌心

如果有人和我有同样的问题,而且字符集已经是正确的,那么只需这样做:复制.html文件中的所有代码。打开记事本(或任何基本文本编辑器)并粘贴代码。去“文件->保存为”输入文件名“example.html”(选择“另存为类型:所有文件”(.)")选择编码作为UTF-8点击Save,您现在可以删除旧的.html文件,编码应该是固定的

蝴蝶刀刀

问题:就连我都面临着我们送去的问题“GB”在POST请求中有一些字符串到crm系统,但是当我们从crm进行get调用时,它会返回。‘GB’有一些字符串内容。所以我们分析的是“GB”被转换成‘GB’.分析:我们在做研究后发现的问题是,在POST Call中,我们设置了HttpWebRequest内容类型为“text/xml”在打电话的时候“text/xml;charset:utf-8”.解决办法:因此,作为解决方案的一部分,我们包括了字符集:utf-8在邮政请求和它的工作。
打开App,查看更多内容
随时随地看视频慕课网APP