两个将简体中文网页自动转为繁体中文网的页简单方法 (原理非常简单,尚不完善 IHttpHandler Proxy / Response.Filter)
2005-03-22 11:28
766 查看
一:
/*
将"任意"在线简体中文网页转为繁体中文页简单方法
以前都写在 Aspx 的 Codebehind 里用 WebRequest 抓别人的网页
ASP 时代用 XMLHTTP Object 抓
1. Microshaoft.HttpHandlers.cs 保存到 IIS 站点或某虚拟目录下的 \bin\Microshaoft.HttpHandlers.cs
2. csc /t:library Microshaoft.HttpHandlers.cs /r:C:\WINNT\Microsoft.NET\Framework\v1.1.4322\Microsoft.VisualBasic.dll
生成 IIS 站点或某虚拟目录下的 \bin\Microshaoft.HttpHandlers.dll
3. IIS 站点或某虚拟目录下 Web.Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation defaultLanguage="c#" debug="true" />
<httpHandlers>
<add verb="*" path="sina.aspx" type="Microshaoft.HttpHandlers.StrConvHttpHandler,Microshaoft.HttpHandlers"/>
</httpHandlers>
</system.web>
</configuration>
4.新建文本文件,更名为 sina.aspx ,保存到 IIS 站点或某虚拟目录下 sina.aspx
5.这里只考虑了 get 请求! post 请求请参阅:
补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
http://blog.csdn.net/playyuer/archive/2005/02/25/301895.aspx
6. 了解 IHttpHandler 接口参阅:
ms-help://MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfSystemWebIHttpHandlerClassProcessRequestTopic.htm
*/
namespace Microshaoft.HttpHandlers
{
using System.IO;
using System.Net;
using System.Web;
using System.Text;
public class StrConvHttpHandler : IHttpHandler
{
static void Main()
{
StrConvHttpHandler x = new StrConvHttpHandler();
string s = "http://www.sina.com.cn";
s = x.HttpGetRequestReponse(s);
s = Microsoft.VisualBasic.Strings.StrConv(s, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, System.Globalization.CultureInfo.CurrentCulture.LCID);
//s = TCSCConvert(s);
System.Console.WriteLine(s);
}
public void ProcessRequest(HttpContext context)
{
string s = context.Request.RawUrl.ToLower();
//s = s.Replace("http://localhost:8081","http://210.72.237.99/BOTH/1.2/Blog/portal");
s = "http://210.72.237.99/BOTH/1.2/Blog/portal/Default.aspx";
s = "http://www.sina.com.cn";
s = this.HttpGetRequestReponse(s);
s = Microsoft.VisualBasic.Strings.StrConv(s, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, System.Globalization.CultureInfo.CurrentCulture.LCID);
//s = TCSCConvert(s);
context.Response.Write(s);
}
public bool IsReusable
{
get
{
return true;
}
}
public string HttpGetRequestReponse(string URL)
{
HttpWebRequest hwrq = (HttpWebRequest) WebRequest.Create(URL);
HttpWebResponse hwrp = (HttpWebResponse) hwrq.GetResponse();
Stream S = hwrp.GetResponseStream();
StreamReader sr = new StreamReader(S,this.GetEncoding(hwrp));
string ss = null;
string s;
while( (s = sr.ReadLine())!=null )
{
ss += s + "\r\n";
}
S.Close();
S = null;
return ss;
}
public Encoding GetEncoding(HttpWebResponse response)
{
string name = response.ContentEncoding;
Encoding code = Encoding.Default;
if (name == "")
{
string contentType = response.ContentType;
if (contentType.ToLower().IndexOf("charset") != -1)
{
name = contentType.Substring(contentType.ToLower().IndexOf("charset=") + "charset=".Length);
}
}
if (name != "")
{
try
{
code = Encoding.GetEncoding(name);
}
catch{}
}
return code;
}
//经测试,用 COM Word Object 转的效果全好,但是慢!
//private static Word.DocumentClass _d;
private static string TCSCConvert(string s)
{
if (s.Length > 0)
{
// if (_d == null)
// {
// _d = new Word.DocumentClass();
// }
// _d.Content.Text = s;
// _d.Content.TCSCConverter(
// Word.WdTCSCConverterDirection.wdTCSCConverterDirectionSCTC,
// true,
// true
// );
// s = _d.Content.Text;
}
return s;
}
}
}
//==========================================
二:
如果是自己写的 Asp.Net 的页面还有更好的方法:
自己实现一个类继承于 Stream,作为 HttpResponse 的 Filter 属性:
namespace Microshaoft //(\bin\XXX.dll,也可直接放在 Page 的 codebehind)
{
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
public class StrConvFilter : Stream
{
private Stream _sink;
private long _position;
public StrConvFilter(Stream sink)
{
_sink = sink;
}
public override bool CanRead
{
get
{
return true;
}
}
public override bool CanSeek
{
get
{
return true;
}
}
public override bool CanWrite
{
get
{
return true;
}
}
public override long Length
{
get
{
return 0;
}
}
public override long Position
{
get
{
return _position;
}
set
{
_position = value;
}
}
public override long Seek(long offset, System.IO.SeekOrigin direction)
{
return _sink.Seek(offset, direction);
}
public override void SetLength(long length)
{
_sink.SetLength(length);
}
public override void Close()
{
_sink.Close();
}
public override void Flush()
{
_sink.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
if (HttpContext.Current.Response.ContentType == "text/html")
{
Encoding e = Encoding.GetEncoding(HttpContext.Current.Response.Charset);
string s = e.GetString(buffer, offset, count);
s = Microsoft.VisualBasic.Strings.StrConv(s, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, System.Globalization.CultureInfo.CurrentCulture.LCID);
_sink.Write(e.GetBytes(s), 0, e.GetByteCount(s));
}
else
{
_sink.Write(buffer, offset, count);
}
}
}
}
然后:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
this.Response.Filter = new Microshaoft.StrConvFilter(this.Response.Filter);
}
/*
将"任意"在线简体中文网页转为繁体中文页简单方法
以前都写在 Aspx 的 Codebehind 里用 WebRequest 抓别人的网页
ASP 时代用 XMLHTTP Object 抓
1. Microshaoft.HttpHandlers.cs 保存到 IIS 站点或某虚拟目录下的 \bin\Microshaoft.HttpHandlers.cs
2. csc /t:library Microshaoft.HttpHandlers.cs /r:C:\WINNT\Microsoft.NET\Framework\v1.1.4322\Microsoft.VisualBasic.dll
生成 IIS 站点或某虚拟目录下的 \bin\Microshaoft.HttpHandlers.dll
3. IIS 站点或某虚拟目录下 Web.Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation defaultLanguage="c#" debug="true" />
<httpHandlers>
<add verb="*" path="sina.aspx" type="Microshaoft.HttpHandlers.StrConvHttpHandler,Microshaoft.HttpHandlers"/>
</httpHandlers>
</system.web>
</configuration>
4.新建文本文件,更名为 sina.aspx ,保存到 IIS 站点或某虚拟目录下 sina.aspx
5.这里只考虑了 get 请求! post 请求请参阅:
补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
http://blog.csdn.net/playyuer/archive/2005/02/25/301895.aspx
6. 了解 IHttpHandler 接口参阅:
ms-help://MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfSystemWebIHttpHandlerClassProcessRequestTopic.htm
*/
namespace Microshaoft.HttpHandlers
{
using System.IO;
using System.Net;
using System.Web;
using System.Text;
public class StrConvHttpHandler : IHttpHandler
{
static void Main()
{
StrConvHttpHandler x = new StrConvHttpHandler();
string s = "http://www.sina.com.cn";
s = x.HttpGetRequestReponse(s);
s = Microsoft.VisualBasic.Strings.StrConv(s, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, System.Globalization.CultureInfo.CurrentCulture.LCID);
//s = TCSCConvert(s);
System.Console.WriteLine(s);
}
public void ProcessRequest(HttpContext context)
{
string s = context.Request.RawUrl.ToLower();
//s = s.Replace("http://localhost:8081","http://210.72.237.99/BOTH/1.2/Blog/portal");
s = "http://210.72.237.99/BOTH/1.2/Blog/portal/Default.aspx";
s = "http://www.sina.com.cn";
s = this.HttpGetRequestReponse(s);
s = Microsoft.VisualBasic.Strings.StrConv(s, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, System.Globalization.CultureInfo.CurrentCulture.LCID);
//s = TCSCConvert(s);
context.Response.Write(s);
}
public bool IsReusable
{
get
{
return true;
}
}
public string HttpGetRequestReponse(string URL)
{
HttpWebRequest hwrq = (HttpWebRequest) WebRequest.Create(URL);
HttpWebResponse hwrp = (HttpWebResponse) hwrq.GetResponse();
Stream S = hwrp.GetResponseStream();
StreamReader sr = new StreamReader(S,this.GetEncoding(hwrp));
string ss = null;
string s;
while( (s = sr.ReadLine())!=null )
{
ss += s + "\r\n";
}
S.Close();
S = null;
return ss;
}
public Encoding GetEncoding(HttpWebResponse response)
{
string name = response.ContentEncoding;
Encoding code = Encoding.Default;
if (name == "")
{
string contentType = response.ContentType;
if (contentType.ToLower().IndexOf("charset") != -1)
{
name = contentType.Substring(contentType.ToLower().IndexOf("charset=") + "charset=".Length);
}
}
if (name != "")
{
try
{
code = Encoding.GetEncoding(name);
}
catch{}
}
return code;
}
//经测试,用 COM Word Object 转的效果全好,但是慢!
//private static Word.DocumentClass _d;
private static string TCSCConvert(string s)
{
if (s.Length > 0)
{
// if (_d == null)
// {
// _d = new Word.DocumentClass();
// }
// _d.Content.Text = s;
// _d.Content.TCSCConverter(
// Word.WdTCSCConverterDirection.wdTCSCConverterDirectionSCTC,
// true,
// true
// );
// s = _d.Content.Text;
}
return s;
}
}
}
//==========================================
二:
如果是自己写的 Asp.Net 的页面还有更好的方法:
自己实现一个类继承于 Stream,作为 HttpResponse 的 Filter 属性:
namespace Microshaoft //(\bin\XXX.dll,也可直接放在 Page 的 codebehind)
{
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
public class StrConvFilter : Stream
{
private Stream _sink;
private long _position;
public StrConvFilter(Stream sink)
{
_sink = sink;
}
public override bool CanRead
{
get
{
return true;
}
}
public override bool CanSeek
{
get
{
return true;
}
}
public override bool CanWrite
{
get
{
return true;
}
}
public override long Length
{
get
{
return 0;
}
}
public override long Position
{
get
{
return _position;
}
set
{
_position = value;
}
}
public override long Seek(long offset, System.IO.SeekOrigin direction)
{
return _sink.Seek(offset, direction);
}
public override void SetLength(long length)
{
_sink.SetLength(length);
}
public override void Close()
{
_sink.Close();
}
public override void Flush()
{
_sink.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
if (HttpContext.Current.Response.ContentType == "text/html")
{
Encoding e = Encoding.GetEncoding(HttpContext.Current.Response.Charset);
string s = e.GetString(buffer, offset, count);
s = Microsoft.VisualBasic.Strings.StrConv(s, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, System.Globalization.CultureInfo.CurrentCulture.LCID);
_sink.Write(e.GetBytes(s), 0, e.GetByteCount(s));
}
else
{
_sink.Write(buffer, offset, count);
}
}
}
}
然后:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
this.Response.Filter = new Microshaoft.StrConvFilter(this.Response.Filter);
}
相关文章推荐
- 两个将简体中文网页自动转为繁体中文网的页简单方法 (原理非常简单,尚不完善 IHttpHandler Proxy / Response.Filter)
- .Net/C#: 一个将在线简体中文网页转为繁体中文页简单方法 (尚不完善 IHttpHandler Proxy / Response.Filter)
- .Net/C#: 一个将在线简体中文网页转为繁体中文页简单方法 (尚不完善 IHttpHandler Proxy / Response.Filter)
- .Net/C#: 一个将在线简体中文网页转为繁体中文页简单方法 (尚不完善 IHttpHandler Proxy / Response.Filter)
- .Net/C#: 一个将在线简体中文网页转为繁体中文页简单方法
- 每天自动替换网页背景颜色的简单方法
- 最近在搞fmx开发,用idhttp post 数据 返回中文乱码,在网上找了好多都解决不了,后来自己琢磨出方法,非常简单 uses IdGlobal lstr := idhttp1.Pos
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 简体中文和繁体中文转换方法
- jquery让两个div高度自动适应 不用再看别的方法了 这个最简单
- Use Response.Filter来简体繁体转换 静态页生成. 利用UrlRewrite,asp.net动态生成htm页面
- jquery让两个div高度自动适应 不用再看别的方法了 这个最简单
- 讨巧的站点简体/繁体中文切换方法
- JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
- 三种简单的html网页自动跳转方法
- 简单实现网页简体中文转换到繁体中文
- jquery让两个div高度自动适应 不用再看别的方法了 这个最简单
- 最简单的网页繁体简体切换
- QTableView中文本根据内容自动换行的简单方法
- C#利用微软自带库进行中文繁体和简体之间转换的方法