Asp classic 经典ASP文本替换和UTF-8编码

Asp classic 经典ASP文本替换和UTF-8编码,asp-classic,utf-8,iis-6,Asp Classic,Utf 8,Iis 6,我们有一个网站,使用经典的ASP 我们发布过程的一部分替换了文件中的值,我们在其中发现了一个bug,它会将文件写为UTF-8 这会导致我们的应用程序开始抛出垃圾。撇号作为一些编码字符返回 如果我们随后删除声明此文件为UTF-8的BOM表,那么以前呈现为垃圾的文本现在将正确显示 IIS在遇到UTF-8文件时是否有不同的做法?UTF-8不使用BOM;在某些微软软件中,这是一个令人恼火的错误特性。您需要找到发布流程的哪一步是将UTF-8编码的BOM放入您的文件并修复它 — 即使您正在使用UTF-8,您

我们有一个网站,使用经典的ASP

我们发布过程的一部分替换了文件中的值,我们在其中发现了一个bug,它会将文件写为UTF-8

这会导致我们的应用程序开始抛出垃圾。撇号作为一些编码字符返回

如果我们随后删除声明此文件为UTF-8的BOM表,那么以前呈现为垃圾的文本现在将正确显示


IIS在遇到UTF-8文件时是否有不同的做法?

UTF-8不使用BOM;在某些微软软件中,这是一个令人恼火的错误特性。您需要找到发布流程的哪一步是将UTF-8编码的BOM放入您的文件并修复它 — 即使您正在使用UTF-8,您也应该停止这样做,这在现在确实是最好的

但我怀疑是IIS造成了显示问题。更可能的是,浏览器猜测最终显示页面的字符集,当它看到看起来像是UTF-8编码的字节时,它猜测整个页面是UTF-8。您应该能够通过使用HTTP头声明最终字符集来阻止它这样做:

Content-Type: text/html;charset=iso-8859-1
和/或HTML中的元元素

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />


现在(假设ISO-8859-1实际上是数据所在的字符集),它应该显示OK。但是,如果您的文件在开始时确实有UTF-8编码的BOM,那么您现在会在页面中将其视为“ï»”,这就是ISO-8859-1中这些字节的外观。所以你仍然需要摆脱这个错误。

我昨天在搜索同一个问题时发现:

这一页的重要部分,以防它消失

ASP代码:

Response.ContentType = "text/html"
Response.AddHeader "Content-Type", "text/html;charset=UTF-8"
Response.CodePage = 65001
Response.CharSet = "UTF-8"
以及以下HTML元标记:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

我们使用了meta标记和asp字符集属性,但是页面仍然没有正确呈现。将其他三行添加到asp文件后,一切都正常工作


希望这有帮助

如果使用access db,则应写入

Session.CodePage=65001
Set tabtable= Conn.Execute("SELECT * FROM  table")

对,这是有道理的。它实际上是一些专门为处理此类问题而编写的代码中的一个bug。谢谢。我必须承认这个答案让我困惑。“UTF-8不使用BOM表”你能给它加硼吗?这在什么方面是一种“错误特征”?我从来没有遇到过使用包含这个零宽度空格字符的UTF-8文件的问题,您遇到过什么问题?任何基于字节的文本工具(如Shell、配置文件加载器等)在文件开头显示“ï»?时都会立即崩溃;UTF-8的明确目标是与对Unicode一无所知的工具兼容,但UTF-8+BOM打破了这一点。甚至一些支持Unicode的工具也会被它绊倒,因为只有在UTF-16的Unicode解码过程中,BOM才会出现并自动删除。UTF-8+BOM破坏了应用程序,在Unicode规范中没有理由使用它;它甚至没有任何好处,因为UTF-8没有字节顺序问题。同样,对“UTF-8不使用BOM”感到困惑的是,不需要澄清,这只是一个错误构建的确认。如果删除UTF-8 BOM导致页面正确呈现,那么内容肯定不是UTF-8?您不需要meta标记和
Response.CharSet=“UTF-8”
,因为它们都有相同的用途,我个人更喜欢使用
Response.CharSet=“UTF-8”
而不是在中显式地将其设置为元标记。另外,
Response.AddHeader“Content-Type”,“text/html;charset=UTF-8”
只是一种明确的书写形式
Response.ContentType=“text/html”
Response.charset=“UTF-8”
您的建议毫无意义,坚持使用
Response.ContentType
Response.CharSet
。在元标记中隐式声明您的字符集和ContentType符合W3C可接受实践标准。无论您决定如何在asp中声明标题(冗余与否),您仍然应该包含一个声明内容类型和字符集的元标记。如果您通过W3C验证检查器运行一个页面,它将在没有类型声明的元标记的情况下失败。在这种特殊情况下,声明太多比声明太少要好。