首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
TechnoFantasy (52)
feifei1018 (19)
coofucoo (108)
qingrun (67)
btbtd (83)
longrujun (64)
cyz1980 (101)
ssll2826 (10)
EmilMatthew (73)
goodboy1881 (15)
CSDN - 文档中心 - .NET 阅读:3931   评论: 2    参与评论
标题   利用filter实时切换big5和gb2312,以及gb2312的简繁体     选择自 qiushuiwuhen 的 Blog
关键字   秋水无恨 实时切换 big5 gb2312 简繁体 charset
出处  

以前解决gb2312/big5实时转换的做法一般是修改Response.ContentEncoding

string switchLanguage(String strLanguage){
 if(strLanguage.StartsWith("zh-cn")){
  Response.ContentEncoding=Encoding.GetEncoding(936);
  return "gb2312";
 }
 if(strLanguage.StartsWith("zh")){
  Response.ContentEncoding=Encoding.GetEncoding(950);
  return "big5";
 }
 Response.ContentEncoding=Encoding.GetEncoding(1252);
 return "iso-8859-1";
}

范例:
 switchLanguage(Request.UserLanguages[0]);
 
但有些GB2312简体字没有对应的Big5,所以需要先转换成繁体的Gb2312,再进行转换
如:“秋水无恨”的无,“中国”的国,就会显示“秋水?恨”和“中?”
等需要先转化为“秋水無恨”和“中國”,再转化为Big5。

而filter正好帮助我们实现实时切换,主要源代码如下(_sGB和_tGB是GB2312简繁体对应的库)。

      public override void Write(byte[] buffer, int offset, int count)
      {
         Encoding e=Encoding.GetEncoding(936);
         string str=e.GetString(buffer,offset,count);
         for(int i=0;i<str.Length;i++){
          int j=_sGB.IndexOf(str[i]);
          if(j!=-1)str=str.Replace(_sGB[j],_tGB[j]);
         }
         e=Encoding.GetEncoding(System.Web.HttpContext.Current.Response.Charset);
         _sink.Write(e.GetBytes(str), 0, e.GetByteCount(str));
      
      }
 

范例:

<%@ Page Language="C#" %>
<script runat=server>
protected void Page_Load(Object sender, EventArgs ev)
{

 Response.ContentEncoding=Encoding.GetEncoding(936);
 if(Request["e"]!=null){
  Response.Filter = new qswhFilter.g2bFilter(Response.Filter);
  if(Request["e"]=="1")Response.Charset="big5";
 }
 userName.Text="秋水无恨(qiushuiwuhen)";
}
</script>
<asp:hyperlink runat=server NavigateUrl="g2bFilter.aspx" Text="Gb2312简体" />
<asp:hyperlink runat=server NavigateUrl="g2bFilter.aspx?e=0" Text="Gb2312繁体" />
<asp:hyperlink runat=server NavigateUrl="g2bFilter.aspx?e=1" Text="Big5繁体" />
hi,你好,我是<asp:label runat=server id=userName/>,欢迎来到<%="csdn中国程序员大本营"%>。

ps.如果web.config中有
 <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312"/>
可省略
 Response.ContentEncoding=Encoding.GetEncoding(936);

cs 源代码和dll:
http://www.blueidea.com/user/qswh/g2bFilter.zip
dll直接拷到应用程序的bin目录即可调用


相关文章
对该文的评论
qiushuiwuhen ( 2002-12-23)
一样的原理,先通过Encoding转化为GB2312,
而其中有一些简体字的繁体,然后根据GB2312的简繁对应表转化为简体
NoFile ( 2002-12-19)
请问如何将繁体字转变为简体字!谢谢