2009-09-21 21 views
10

我们有一个使用经典ASP的网站。经典ASP文本替换和UTF-8编码

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

这会导致我们的应用程序开始吐出垃圾。撇号以某些编码字符的形式返回。

如果我们接着去除表示此文件为UTF-8的BOM,则以前呈现为垃圾的文本现在可以正确显示。

当遇到UTF-8文件时IIS有什么不同吗?

+0

如果删除UTF-8 BOM导致页面正确呈现则内容是不是UTF-8肯定? – AnthonyWJones 2009-09-22 06:48:20

回答

6

UTF-8不使用物料清单;在某些微软软件中,这是一个令人讨厌的错误特性,使它们存在。你需要找到你的发布过程在你的文件中放入一个UTF-8编码BOM,并修复它 - 你应该停止,即使你使用UTF-8 ,现在真的是最好的。

但我怀疑这是IIS导致显示问题。浏览器更可能猜测最终显示页面的字符集,并且当它看到看起来像是UTF-8编码的字节时,它会猜测整个页面是UTF-8。您应该能够通过使用HTTP头指出一个明确的字符集,以阻止它这样做:在HTML

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

Content-Type: text/html;charset=iso-8859-1 

和/或meta元素现在(假设ISO-8859- 1实际上是你的数据所在的字符集),它应该显示OK。但是,如果您的文件在开始时真的具有UTF-8编码的BOM,现在您将在页面中看到“”,这些字节在ISO-8859-1中是这样的。所以你仍然需要摆脱那个misBOM。

+0

这是有道理的。 这实际上是一些专门为处理这类问题而编写的代码中的一个错误。 谢谢。 – 2009-09-21 12:51:44

+1

我必须承认这个答案令我困惑。“UTF-8不使用物料清单”,你能否说得通吗?这是一种“错误”?我从来没有遇到过使用包含这个零宽度空格字符的UTF-8文件的问题,你遇到了什么问题? – AnthonyWJones 2009-09-22 06:50:41

+0

任何基于字节的文本工具(例如shell,配置文件加载器等)将在文件开始处显示“”时立即翻转; UTF-8的明确目标是与对Unicode一无所知的工具兼容,但UTF-8 + BOM打破了这一点。即使一些支持Unicode的工具也会跳过它,因为只有预期BOM存在并且通过UTF-16的Unicode解码过程自动删除。 UTF-8 + BOM打破了应用程序,在Unicode规范中没有理由使用它;甚至没有任何好处,因为UTF-8没有字节顺序问题。 – bobince 2009-09-22 12:48:23

13

我正在寻找在完全相同的问题,昨天碰到:

http://blog.inspired.no/utf-8-with-asp-71/

重要组成部分,从该页面,如果它消失了......

ASP代码:

Response.ContentType = "text/html" 
Response.AddHeader "Content-Type", "text/html;charset=UTF-8" 
Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

和以下HTML META标记:

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

我们使用元标记和asp CharSet属性,但页面仍然没有正确呈现。将其他三行添加到asp文件后,所有工作都完成了。

希望这会有所帮助!

+1

您不需要元标记和'Response.CharSet =“UTF-8”',因为它们都用于相同的目的,我个人更喜欢使用'Response.CharSet =“UTF-8”'而不是明确设置它作为[tag:HTML]中的元标记。另外'Response.AddHeader“Content-Type”,“text/html; charset = UTF-8”'只是写'Response.ContentType =“text/html”'和'Response.CharSet =“的显式形式”UTF- 8“'你所暗示的是毫无意义的,坚持使用'Response.ContentType'和'Response.CharSet'。 – Lankymart 2014-02-05 10:51:34

+0

非常hepfull @Werewolf thx你为你的贡献.. – Artemination 2015-01-16 15:31:51

+0

你救我的生命:) – kyawagwin 2015-08-21 02:15:56

2

如果您在使用Access数据库,你应该写

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