nicye

导航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

与我联系

搜索

 

常用链接

留言簿(2)

我参加的小组

我参与的团队

我的标签

随笔档案

相册

Friends

最新评论

阅读排行榜

评论排行榜

asp.net 里 include UTF8 垃圾问题

很久以前,在我第一次使用 utf-8 编码做网站时,就遇到过 IE 下莫名其妙的空出一行(FireFox 下无问题),肉眼看不见,也就是 UTF-8 BOM 签名了,更多 BOM 知识请查找“Unicode BOM”。

先讲讲我的项目架构,IIS + .net 2.0 + SSI
暂且不讨论为什么要用 SSI,而不用其它技术(如 UserControl)

生成 index.shtml 肯定要带 BOM,其实带不带也不会影响页面上会出现空白行。
index.shtml 内容如下:

<html>
<body>

<!--#include file="head.shtml"-->
</body>
</html>


1、head.shtml 保存为 UTF-8 带    BOM 时,会出现空白行(页面元素当然不止这些)。
2、head.shtml 保存为 UTF-8 不带 BOM 时,会出现乱码,因为 SSInc.dll 加载这个文件时,不知道文件的编码(因为没有 BOM 签名),因此会按 GBK 来加载文件,最后乱码。。。

所以,正也不行,反也不行,只有最后一招了,也是迫不得已。。



改 index.shtml 为:
<html>
<body>

<!--<!--#include file="head.shtml"-->
</body>
</html>

在 head.shtml  的页开头加上
<!--BOM-->
内容。。。。。

意图 将 <!--#include 前的 <!-- 和 head.shtml 里的 BOM--> 用HTML注释掉,在 asp 下应该没有问题。
2年前,用 asp.net include 就发现一个问题,就是它的解释方法和 asp 完全不同,不信可以试试
<!--<!--#include file="head.shtml"-->
执行结果等效于
<!--#include file="head.shtml"-->




又试了半个小时,几近绝望,被 IE 这个小小的问题折磨。一阵乱试后发现

<!--#<!--#include file="head.shtml"-->

被忽略,暂时这样吧,期待更好的解决方案。。

posted on 2008-04-17 12:00 nicye 阅读(2072) 评论(25)  编辑 收藏

评论

#1楼  2008-04-17 12:16 狼Robot      

很神奇的样子.   回复  引用  查看    

#2楼  2008-04-17 13:12 李战      

有这等事儿?路过   回复  引用  查看    

#3楼 [楼主] 2008-04-17 13:27 nicye      

@李战

网上关于这类问题的文章不太多,主要是关键字不明显吧,都被其它内容占有的

我相信不少朋友都遇到过这类问题

如何解决的呢?   回复  引用  查看    

#4楼  2008-04-17 13:37 探矿者      

也想知道   回复  引用  查看    

#5楼  2008-04-17 16:52 ASP.NET CMS [未注册用户]

不是很明白
晕了   回复  引用    

#6楼 [楼主] 2008-04-17 16:56 nicye      

@ASP.NET CMS

你用过 utf-8 建站,就有可能遇到   回复  引用  查看    

#7楼  2008-04-17 22:12 zzz [未注册用户]

unicode bom 原来跟 utf-8 signature一样啊。。。   回复  引用    

#8楼  2008-04-18 00:02 joewang [未注册用户]

我以前也遇到过这种问题,后来把生成HTML文件的编码统一换成GB2312,才解决.   回复  引用    

#9楼 [楼主] 2008-04-18 09:35 nicye      

@joewang
你说的只能在中文 OS 才行   回复  引用  查看    

#10楼  2008-04-18 09:39 Ivan Jiang      

强烈关注此话题
我一开始一直以为是css代码编写造成浏览器兼容性问题,可后来反复调试发现只有include后才有此问题。

转成GB2312实在是无奈之举

望高人解决~

cms系统中SHTML还是经常用的   回复  引用  查看    

#11楼 [楼主] 2008-04-18 09:49 nicye      

@Ivan Jiang
就 IE 有这个问题,IE 害死人   回复  引用  查看    

#12楼  2008-04-18 09:53 Ivan Jiang      

我现在的解决办法是把
header.html
footer.html
用UltraEdit这样的软件保存成utf-8 不带Dom的格式

而index.shtml该怎么来还是怎么来

  回复  引用  查看    

#13楼 [楼主] 2008-04-18 10:09 nicye      

@Ivan Jiang
页面上如果需要 include 一个程序生成的文件,如左边最新新闻。其它页面都 include 它

引:(以下都是用 asp.net 的 UTF8 流写文件)
1、head.shtml 保存为 UTF-8 带 BOM 时,会出现空白行(页面元素当然不止这些)。
2、head.shtml 保存为 UTF-8 不带 BOM 时,会出现乱码,因为 SSInc.dll 加载这个文件时,不知道文件的编码(因为没有 BOM 签名),因此会按 GBK 来加载文件,最后乱码。。。

Encoding.UTF8 带 BOM
new UTF8Encoding(false) 不带 BOM
最后,还是不能解决   回复  引用  查看    

#14楼  2008-04-18 10:14 Ivan Jiang      

对! 就是用 new UTF8Encoding(false) 生成不带BOM的文件。


你可以尝试把head.shtml改成不再包含其它文件了,就能解决了。
现在我的被包含文件都是html格式的。

如果被包含文件还是shtml,那层层包含结构也不是很清晰啊。   回复  引用  查看    

#15楼 [楼主] 2008-04-18 10:41 nicye      

@Ivan Jiang
先谢了,我试过

如果 index.shtml 里include就没有问题
如果 index.aspx 里include就乱码了(对于 .aspx 还有更奇怪的,
include head.shtml(NO BOM)正常,里面有中文
include bottom.shtml(NO BOM)正常,里面有中文
include xxx.shtml(NO BOM)乱码,里面有中文)

再看看 http://www.cnblogs.com/kellynic/archive/2008/04/17/1158303.html 这篇文章,你可以试试,太搞怪了
  回复  引用  查看    

#16楼  2008-04-18 11:23 Ivan Jiang      

你是说b.shtml文件里
123</a>这个位置加不加回车在IE7下面效果不一样?

我本机上没有IE7 还没试过 在IE6 和FF2里面没问题啊

我现在用index.shtml或者任何的aspx
去include head.html(NO BOM)都没有问题

而且被包含文件里面也没加过你说的<!--BOM-->

所以不太清楚如果include head.shtml情况会怎样   回复  引用  查看    

#17楼 [楼主] 2008-04-18 11:37 nicye      

@Ivan Jiang
b.shtml 不加回车,浏览页面后明显的少了一个 </a>
加回车就没有问题,但明显字符不对劲
细心就可以观察到


关于 include BOM 问题,我实在无能为力,折磨了两天
所以以后 我要 include 的文件,我会在最前面加上 -->
再在 include 调用的地方改成 <!--#<!--#include file="*.shtml"-->

这样就什么问题也没了,页面照样保存成 UTF-8 BOM
很勉强的解决方法,实在没折了
关于这个问题就先这样了,只能感慨,还能怎样呢?IE太差劲了   回复  引用  查看    

#18楼  2008-04-19 14:53 NormRen [未注册用户]

你这个方法很实用,呵呵,谢了


经过试验
<!--#fixBom><!--#include ......--><!--fixBom-->
生成的时候把#fixBom>替换成#就可以去除顶部的空行了
在include...后面加一段注释,html模板代码就不会被<!--#通通变为注释了   回复  引用    

#19楼 [楼主] 2008-04-19 15:25 nicye      

@NormRen
你的方法在 IE 下没有问题,试过 Firefox 没有?呵呵
Firefox 和 IE 的注释解释方式不同


<!--#abc<!--BOM-->

IE 下注释的内容为 #abc<!--BOM
Firefox 下为 BOM,前面的不会解释成注释内容,然后页面自然就会乱   回复  引用  查看    

#20楼  2008-04-20 21:53 NormRen [未注册用户]

@nicye
呵呵,恩,再次感谢~   回复  引用    

#21楼  2008-04-21 09:27 NormRen [未注册用户]

刚试过一下, <!--#--在IE和火狐下测试通过 :)   回复  引用    

#22楼 [楼主] 2008-04-21 09:43 nicye      

--引用--------------------------------------------------
NormRen: 刚试过一下, &lt;!--#--在IE和火狐下测试通过 :)
--------------------------------------------------------
哈哈,你也遇到这个问题?   回复  引用  查看    

#23楼  2008-04-21 09:49 NormRen [未注册用户]

@nicye
是啊,呵呵~~   回复  引用    

#24楼  2008-04-25 12:14 Klesh Wong      

我遇到过类似的情况,用editplus

其中,unicode/unicode big endian都会出现空白行,使用utf-8问题消失,可以试一下。

  回复  引用  查看    

#25楼  2008-09-01 16:00 君子兰1 [未注册用户]

哥们 我也绝望中。。。 aspx为什么要必须BOM才行 微软啊微软 太操蛋了
返回给客户端的居然又不带BOM...   回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-17 12:02 编辑过


相关链接: