您的位置:首页 > 运维架构 > 网站架构

.net 2.0下进行网站的简、繁转换

2009-02-03 15:28 357 查看
规则:

以URL地址来决定简繁的显示,zh-cn/index.htm为简体,zh-tw/index.htm为繁体。

思路很简单,以IHttpHandler接口为基类,写一个类,用来处理HttpHandler,用ProcessRequest方法来处理客户端的请求。在ProcessRequest方法中获取url值,有zh-tw就用繁体,反之用简体。

using System;

using System.IO;

using System.Data;

using System.Configuration;

using System.Collections.Generic;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Text;

using System.Text.RegularExpressions;

using Microsoft.VisualBasic;

导入以上命名空间,注意Microsoft.VisualBasic,要先引用一下Microsoft.VisualBasic。

public class HtmlHttpHandler : IHttpHandler

{

//这里是定义的一个结构 ,与简繁转换无关,主要设定url重写的规则。

private List<RegexInfo> _regex_list = new List<RegexInfo>();

public HtmlHttpHandler()

{

DataSet ds = new DataSet();

ds.ReadXml(ConfigurationManager.AppSettings["RegexsXml"]);

foreach (DataRow r in ds.Tables["regex"].Rows)

_regex_list.Add(new RegexInfo(((string)r["b"]).Trim(), ((string)r["a"]).Trim()));

}

//主方法

public void ProcessRequest(HttpContext context)

{

string path = context.Request.Path;

//foreach (RegexInfo r in _regex_list)

//path = Regex.Replace(path, r._before, r._after); //url重写

//开始判断并转换

if (path.IndexOf("zh-tw") != -1)

{

path = path.Replace("zh-tw", "zh-cn");

//以自定义方式过滤

context.Response.Filter = new CnToTwStream(context.Response.Filter, context.Response.ContentEncoding);

}

context.Server.Transfer(path);

}

// Override the IsReusable property.

public bool IsReusable

{

get { return true; }

}

}

CnToTwStream类实现简繁的转换

class CnToTwStream : Stream

{

private Stream _sink;

private MemoryStream _ms;

private Encoding _encoding;

public CnToTwStream(Stream sink, Encoding encoding)

{

_sink = sink;

_ms = new MemoryStream();

_encoding = encoding;

}

public override bool CanRead

{

get { return false; }

}

public override bool CanSeek

{

get { return false; }

}

public override bool CanWrite

{

get { return true; }

}

public override long Length

{

get { return _ms.Length; }

}

public override long Position

{

get { return _ms.Position; }

set { throw new NotSupportedException(); }

}

public override int Read(byte[] buffer, int offset, int count)

{

throw new NotSupportedException();

}

public override long Seek(long offset, System.IO.SeekOrigin direction)

{

throw new NotSupportedException();

}

public override void SetLength(long length)

{

throw new NotSupportedException();

}

public override void Close()

{

_ms.Close();

byte[] buffer_cn = _ms.GetBuffer();

string str_cn = _encoding.GetString( buffer_cn );

//用Strings类的StrConv方法,其中TraditionalChinese是VisualBasic中的一个枚举

string str_tw = Strings.StrConv(str_cn, VbStrConv.TraditionalChinese, 0);

str_tw = str_tw.Replace("__zh-cn__", "__zh-tw__");

byte[] buffer_tw = _encoding.GetBytes(str_tw);

using (_sink)

{

_sink.Write(buffer_tw, 0, buffer_tw.Length);

}

}

public override void Flush()

{

_ms.Flush();

}

public override void Write(byte[] buffer, int offset, int count)

{

_ms.Write(buffer, offset, count);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: