/*
一個將"任意"線上簡體中文網頁轉為繁體中文頁簡單方法
以前都寫在 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);
}