ASP.NET开发经验(1) — 解决ASP.NET与CSS中定义的中文字体名的冲突

最近做了一个 ASP.NET 的文档管理程序,有点类似于简化的 SharePoint Portal Server 2001,有兴趣的可以看看程序运行的截图 (多图)。

在开发过程中,陆续碰到和解决了一些不常见的问题,我会慢慢把这些问题和解决的办法都写出来。代码目前还有点乱,过两天再整理一下,请 Ma QiJGTM’2004kaneboy 等几位高手帮我做一下 Code Review 或 Refactory。

前两天,在修改 ASPX 页面时,发现一个奇怪的问题,链接的CSS 文件里指定的其它设置都管用,就是字体名称设置不管用,如果直接在 ASPX 页面中指定字体名称(Style=”font-family:宋体”)就是正常的。

为了测试,我用 FrontPage 新建了一个 HTML 页面并链接了CSS 文件,页面显示正常,但当我把 HTM 后缀改成 ASPX 后,又失效了。

难道是 ASPX 和 CSS 有冲突? 可这两个东西风马牛不相及呀,于是仔细对比 HTM 和 ASPX 页面的源码,没有发现任何不同的地方,真是百思不得其解。最后终于无意中发现,HTM 页面和 ASPX 页面的编码方式不一样,HTM 是 GB2312 ,ASPX 是 UTF-8(即使其中含有 <meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″> 的标记)。

到此时我才明白,原来就是因为 ASPX 的输出编码为 Unicode,在处理 CSS 中的中文字体名(如“宋体”,“黑体”)时出错了错误,导致不能正确显示指定的字体。

处理办法:

1) 将 ASP.NET 的默认编码方式由 UTF-8 改为 GB2312 ;

    不过,现在都搞全环化、国际化,还是用 UTF-8 好。

2) 将 CSS 文件中的中文字体名变为英文名称;

   如 “Font-Family: 宋体” 改为 “Font-Family: SimSun” ,其它字体的英文名称如:SimYou 幼圆; SimHei 黑体; SimKai 楷体; SimFang 仿宋; SimLi 隶书等。

3) 将 CSS 文件中的中文字体名改为 Unicode 表示(\u…)

    此种方法未试验,不知是否可行。

至于为什么我一定要用中文字体呢,原因是中文字体是等宽的,在处理页面时,能很精确控制元素的宽度,这样有利于版面的设计,我对软件界面的要求是很高的 笑脸

“ASP.NET开发经验(1) — 解决ASP.NET与CSS中定义的中文字体名的冲突”的23个回复

  1. 但中文字体中的英文太难看了,不知道当初是哪家公司做的。因为这个我坚决不用中文界面的软件。我一般都是在VMWare中跑中文界面的软件。

  2. 多谢老兄信任!

    BTW: 关于CSS编码的问题可以试一下在VS.NET中另存为对话框中点出Save按钮的下拉菜单,里面有可以指定编码方式的保存,选择所需的编码保存即可。同理,对于有些.js/.vbs脚本文件也时常会出现功能异常的情况,多半也是编码不同所致。

  3. 没错,我写code formatter htc的时候因为类似问题花了我2个多小时直到不情愿的进入debug以后才发现是中文注释问题。(相同的HTC在html中运行完全正常,在.aspx中就错了)

  4. 还是 JGTM’2004 厉害,你的处理办法最优 🙂 ..

    我曾经尝试将其存为 Unicode 格式,但没有注意 Save 竟然可以下拉 🙁

  5. @JGTM’2004
    啊,早说呢,以前有个脚本就是meizz的日历控件。我在asp.net
    怎么都不好用,最后只好很不情愿的使用了 #include.
    刚才回去试了一下,一试就灵。:D

  6. 还是 JGTM高!
    学到"Font-Family: 宋体" 改为 "Font-Family: SimSun,但不明白
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 和CONFIG里的UTF-8 区别??
    如果我网页META指定是GB2312,是不是应该把CONFIG里的UTF-8也相应改成GB2312呢?不改又会怎么样??

  7. moslem,俺给你捧场来罗:)

    其实你这个问题除了JGTM的方法外,还有有个更好的办法解决:

    修改web.config中的<globlization>中的reponseEncoding属性为gb2312,<globlization requestEncoding=gb2312 responseEncoding=gb2312>。
    如此一来,response的html都是以GB2312进行编码,而你的source code仍旧可以使用utf-8保存,何乐而不为呢?:)

  8. 我在写htc的时候也遇到这个问题,在web.config里修改globalization节点的requestEncoding和responseEncoding的属性值为GB23112解决了这个问题,但是也面临国际化的问题。

  9. 我也遇到这个问题,用的一个时间控件,不能正常使用,就在Web.config里面修改了编码格式。结果控件是能正常显示了,可是原来页面上的字体设置权都不起作用了。
    这是怎么回事啊?

  10. 请教大家!!!我在DW2004中打开.aspx文件时,它显示的是中文,不是乱码,但我在运行时,不管是用绝对路径还是相对路径,运行都是乱码?这到底是怎么回事呀?烦请大家帮忙?这个问题都困扰了我好长时间了!

  11. 谢谢, 我以前还奇怪汉字字体怎么在css不起作用, 原来是字符集的原因, VS就该把所有文件的字符集默认为utf-8

  12. Pingback: 小塘的月亮
  13. 怎么我只是黑体管用啊,其他字体改了都不管用?

    SimYou 幼圆; SimHei 黑体; SimKai 楷体; SimFang 仿宋; SimLi 隶书等。

评论已关闭。