分類
.net

撰寫big5的asp.net程式

由於預設的 asp.net 程式開發是使用 utf-8 的編碼, 所以若是要開發 big5 的 asp.net 程式, 需要做一些調整.

可以參考這篇有關 globalization 項目設定的網頁: http://msdn.microsoft.com/zh-tw/library/hy4kkhe0(VS.80).aspx

其實很單純的將 web.config 中的 system.web 內的 globalization 的屬性: requestEncoding 及 responseEncoding 做些調整即可. 由於預設的是:

<globalization requestEncoding="utf-8" 
               responseEncoding="utf-8" 
               fileEncoding="" 
               culture="" 
               uiCulture="" 
               enableClientBasedCulture="false" 
               responseHeaderEncoding="utf-8" 
               resourceProviderFactoryType="" 
               enableBestFitResponseEncoding="false" />

所以會是 utf-8 的編碼, 若是要開發 big5 的 asp.net 程式, 僅需要做這裡的調整即可. 程式碼本身並不需要更動, 就可以依照這個 web.config 做指定輸出了. 若是字元是 utf-8 的, 但指定用 big5 輸出時, 仍然會有 ?? 這種狀況發生, 也是要注意的地方, 不過一般的狀況下(字元相容的字)是沒有問題的.

但是頁面上的 meta tag 則必須 user 自行手動修改, 或利用小程式輔助來進行調整,

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

因為 web.config 是在 http header 就已經輸出指定的 encoding 囉, 而不是透過 meta tag 的 charset 指示的! 以下是 firefox 配合 Live HTTP headers 的 extension 抓出來的內容:

http://localhost:50201/WebSite2/Default.aspx

 

GET /WebSite2/Default.aspx HTTP/1.1
Host: localhost:50201
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.16) Gecko/20080702 Firefox/2.0.0.16
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

HTTP/1.x 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Tue, 22 Jul 2008 09:42:40 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 537
Connection: Close
———————————————————-

給大家參考看看囉!

分類
.net

StringDictionary強制型別字字典class

在 .NET 裡有個內建的 Hashtable (System.Collections.Hashtable) 可供做 Key/Value Pair 使用, 不過若是要再增加效能, 可以考慮使用 StringDictionary 強制型別字串對照字典, 名稱空間是在 System.Collections.Specilized.StringDictionary . 使用強制型別可以有效提升效能, 原本的 Hashtable 是可以存放 object / object 的方式, 當然也可以存放 string / string , 但總是多了 object 與 string 間的轉換, 而且也容易放錯資料進去, 若是有強制型別的 StringDictionary class 來存放這樣的資料, 在型態上及在效能上都能有效提升.

該 StringDictionary 的使用方式請參考: MSDN Link

其他相關的資料可以參考 Hashtable, 泛型的 Dictionary, 泛型的 KeyValuePair,

其中泛型的 Dictionary 就是利用 Template 進行 Dictionary 的宣告, 讓 Dictionay 的存放資料的型別為指定的型別, 例如:

Dictionary<string, string> dicData = new Dictionary<string, string>();

dicData.Add("a","apple");
dicData.Add("b","banana");
分類
.net

C#判定BIG5字碼的方式

繼上一篇 如何在ASP內判定BIG5碼中文字 之後, 再來整理一下在 ASP.NET C# 中判定 BIG5 碼的方式, 其實方式一樣很單純, 不過不需要利用到轉碼的 code page, 只需要利用 System.Text.Encoding 即可順利判讀, 程式碼如下:

Boolean IsBig5(string strOne)
{
    Boolean bIsBig5 = false;
    byte[] ByteArrayBig5 = System.Text.Encoding.GetEncoding("big5").GetBytes(strOne);
    if (ByteArrayBig5.Length == 2)
    {

        //check A440~C67E 常用字, C940~F9D5 次常用字 

        //42048~50814, 51520~63957            
         
        int iCode = ByteArrayBig5[0] * 256 + ByteArrayBig5[1];
        if ((iCode >= 42048 && iCode <= 50814) || (iCode >= 51520 && iCode <= 63957))
        {
            // chinese char big5 
            bIsBig5 = true;
        }
    }
    return bIsBig5;      
}

利用了 Encoding 的 GetBytes 方式, 取出在 strOne 中的一個字元, 並判定是否為 2個 byte 後, 一樣利用了原來的判定方式, 若落在對應的區間內, 就可以判定為 BIG5 字元集內的字了!

分類
.net

.net Cache物件的Add及Insert不同

最近又剛好寫到 .net Cache 物件的功能了, 之前有介紹過 .net Cache 物件: ASP.NET Cache物件使用方式及應用, 接下來說明一下他的 Insert 方法和 Add 方法的不同.

由於在使用 Cache 時, 通常是先 check Cache 的資料是否存在後, 再進行資料的 Cache 寫入, 然而寫入的方式有兩種, 一種為 Insert , 一種為 Add , 其中差異不少, Insert 方法有幾種不同的排列組合外, 尚有可以一直覆寫的功能, 也就是說, 在利用相同的 key 去 Insert 時, 他會利用最新的資料去覆寫掉原來的資料, 而 Add 方法則是不會覆寫, 也就是 Add 會加不進去, 但也不會產生什麼錯誤, 呼叫完 Add 方法後, 若該 Cache 的 data 仍為有效, 則將該 Cache 的 object 傳回, 而且不異動(更新)原來的 Cache .

上面的述描對於一般的應用都沒太大影響, 反而是 Insert 方法的彈性比較大, 不過由於 Insert 方法會有覆寫的問題, 所以若是大量訪問的網問上, 應該效能會略遜於 Add 方法, 因為 Add 方法在 Cache 尚未過期前, 就不會再去異動 Cache 的資料了, 這點可以再測試看看!

微軟 MSDN 的資料:
Cache.Insert 方法
Cache.Add 方法

分類
.net

如何判斷WMV, WMA, ASF的檔案

wmv, wma 的判斷方式, 是利用這篇參考資料進行實作的:

http://www.microsoft.com/windows/windowsmedia/forpros/format/asfspec.aspx

裡面有一篇非常詳細的 asf 檔案格式的描述, 根據這篇的描述, 我們可以進行程式實作來判定 asf 及 wmv 和 wma, 主要的判定是利用 header 中的 stream type 來進行判斷的, 首先先讀出 asf 的格式檔頭, 讀出 guid 如下: (c#)

Guid guidASF_Header_Object = new Guid("75B22630-668E-11CF-A6D9-00AA0062CE6C");

Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(stream);
           
Guid guidTemp;
byte[] arrbyteGuid = new byte[guidSize];

arrbyteGuid = br.ReadBytes(guidSize);
guidTemp = new Guid(arrbyteGuid);

if (guidTemp == guidASF_Header_Object) // this file is asf format
{
  // .....
}

上面確定為 asf format (可能是 wmv 也可能是 wma), 接下來再進行確認其內容是否有 audio 及 video 的狀況, 來判定應為 wmv 或 wma.

我們必須先找出 header object 為 ASF_Stream_Properties_Object 的內容為 ASF_Audio_Media 或 ASF_Video_Media 的狀況, 通常 wma 僅有 ASF_Audio_Media, 而 wmv 為 ASF_Audio_Media 及 ASF_Video_Media 都存在, 所以就繼續找出 stream 的 type 即可, 程式碼在此, 給大家研究看看, 節省大家在判定這些檔案的時間囉!

checkASF.zip

分類
.net

在Windows2003 64Bit下執行ASP.NET2.0應用程式

由於要測試 windows 2003 64bit OS 下的效能, 必須將 ASP.NET 2.0的應用程式部署上去.

但擔心會有相容性的問題, 於是開始找相關的資料. 其實也都沒有找到. 相關的資料僅有在 x64 上的 iis 若要跑 64bit 模式, 就一定得用 asp.net 2.0 才行, 若是 asp.net 1.1 的話, 就僅能跑在 32bit 模式下. 後來直接將 compile 好的 asp.net 2.0 程式, 部署上去在 x64 下的 iis, 結果可以順利執行, 真是方便, 沒有相容性的問題.

應該是 asp.net build 好的 msil code 並沒有含 32/64相依的程式碼, 而要到 runtime 時, 依 runtime 的環境, 來執行 msil code, 所以沒有相容性的問題. 至於為什麼 1.1 要在 32bit 模式下執行, 想必是因為在 x64 os 上, 並沒有 64bit 的 1.1 runtime isapi, 所以只能在 32bit 模式下執行囉.

以上是升級作業系統至 x64 時的一個小插曲, asp.net 2.0 是不會有什麼問題的啦…

分類
.net

ASP.NET的Callback實作

在ASP.NET 2.0內支援了最令人感興趣的內容, Callback功能, 雖然實務上, 可以利用多種自訂的 server side 程式實作 AJAX 功能, 但是在 ASP.NET 2.0內建的 Callback 功能還是令人激賞, 接下來我們看看如何在 ASP.NET 2.0 下實作這個 Callback 的功能. (本篇文章以 c# 為範例語言)

要實作 Callback 功能, 首先要先了解 ICallbackEventHandler 這個 interface, 該 interface 有兩個方法:

string GetCallbackResult ()
void RaiseCallbackEvent (string EventArgument)

所以要達成 callback 的物件必需繼承 ICallbackEventHandler 這個 interface 並且實作這兩個方法, 一般是寫在 Page 下, 以下為一個範例: