[ASP]過濾非BIG5編碼字元

這篇文章利用了之前的單字元判斷是否為 BIG5 的 ASP程式進行實作 (link), 由於是一個字一個字判定, 所以效率不會太好, 但可以快速解決有關在 UTF-8轉到 BIG5時, 不在該字元集的文字內容, 以過濾掉這類特殊的問題. 程式碼如下:

Function IsBig5(strChar) 
    ' check A440~C67E 常用字, C940~F9D5 次常用字 
    session.codepage="950"  
    Dim lngAsc  
    lngAsc = Asc(strChar)  
    IsBig5 = (lngAsc >= -23488 And lngAsc <= -14722)  
    If Not IsBig5 Then IsBig5 = (lngAsc >= -14016 And lngAsc <= -1579)  
    session.codepage="65001"  
End Function

Function TrimNonBig5(strUTF8)
    For i=1 to Len(strUTF8)  
        charTemp = Mid(strUTF8,i,1)  
        If IsBig5(charTemp) Then
            TrimNonBig5 = TrimNonBig5 + charTemp
        End If
    Next  
End Function

str1 = "桃之雫果凍"
response.write TrimNonBig5(str1)
' output 桃之果凍

str2 = "洋風和菓子零食"
response.write TrimNonBig5(str2)
' output 洋風和子零食

str3 = "游錫堃王建煊"
response.write TrimNonBig5(str3)
' output 游錫王建

以上的程式可以有效地將非在 Big5 字元集中的文字過濾, 避免與傳統編碼程式溝通時的問題.

[2014/11/10 11:12]
若是有需要再補上 ASCII 字元集區段的部分, 可以使用 ASC 於 32~126 的 ASCII Printable 即可(參考資料: http://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart), 記得是在轉 code page前測試 ASCII, 程式碼如下:

Function IsBig5Asc(strChar)
    ' check A440~C67E 常用字, C940~F9D5 次常用字, asc printable 32~126
    Dim lngAsc
    lngAsc = Asc(strChar)
    IsBig5Asc = (lngAsc >= 32 And lngAsc <= 126)
    session.codepage="950"
    lngAsc = Asc(strChar)
    If Not IsBig5Asc Then IsBig5Asc = (lngAsc >= -23488 And lngAsc <= -14722)
    If Not IsBig5Asc Then IsBig5Asc = (lngAsc >= -14016 And lngAsc <= -1579)  
    session.codepage="65001"  
End Function

Function TrimNonBig5Asc(strUTF8)
    For i=1 to Len(strUTF8)  
        charTemp = Mid(strUTF8,i,1)  
        If IsBig5Asc(charTemp) Then
            TrimNonBig5Asc = TrimNonBig5Asc + charTemp
        End If
    Next  
End Function

str1 = "桃之雫果凍1200G(1.2公斤)"
response.write TrimNonBig5Asc(str1)
' output 桃之果凍1200G(1.2公斤)
分類
系統技術

免費試用Windows Azure的雲端服務

微軟的雲端服務 Windows Azure 目前有免費試用的版本, 方便給在學習及測試階段的開發者們一個好用方便的服務.

入口: http://www.windowsazure.com/

進來之後, 可以直接在線上申請試用 3個月免費, 點下[免費試用], 免費的內容如下:

  • 計算 / 每個月 750 小時的小型計算時數
  • 網站 / 10 個網站
  • 行動服務 / 10 個行動服務
  • 關聯式資料庫 / 1 個 SQL 資料庫
  • SQL Reporting / 每個月 100 小時
  • 儲存體 / 35 GB 及 50,000,000 個儲存體交易
  • 頻寬 / 無限制輸入及 25 GB 輸出
  • CDN / 20 GB 輸出及 500,000 個交易
  • 快取 / 128 MB
  • Service Bus / 1,500 個轉送時數及 500,000 則訊息

登入 windows account 之後, 會需要輸入電話號碼(用來收開通簡訊)及信用卡驗證身份(避免濫用)後, 就可以順利開通了.

接下來就是使用這個 3個用的免費服務, 最快的方式是直接建立網站功能(即website), 免費內容可以建立10個網站, 所以就來新增一個網站看看, 從 Web Sites 內容下方, 按下 [+NEW] 後就可以新增一個網站, 接下來會有三個選項:

  1. QUICK CREATE
  2. CREATE WITH DATABASE
  3. FROM GALLERY

為能快速就有個網站可以試玩看看, 我們來選 3. FROM GALLERY, 就可以利用架站的套件直接裝好來用, 如 Drupal, WordPress, Joomla, Mediawiki 等.

來裝個 Drupal 試看看, 選擇後, 需要輸入資訊畫面如下:

第一個 url 就需要輸入一個唯一網址, 然後建立一個新的MySQL資料庫, 選擇地區後, 按下一步, 輸入完成資料庫相關資訊後, 回到 Web Sites的管理介面, Windows Azure 會開始部署, 等一下下後, 就會出現部署完成的資訊, 並該 web site 的狀態為 running , 點下自訂的 url 後, 會進入設定安裝 drupal 的畫面如下:

接下來就很單純啦, 一步一步就可以完成這個 drupal 的安裝. 真的很快很方便, 而且馬上就可以用了呢!

目前裝好了兩個測試的 web site, 一個是 wordpress: http://mypress.azurewebsites.net/ , 另一個就是 drupal: http://dp7.azurewebsites.net/ 還真的蠻方便的.

接下來也可以自行試看看用之前的 QUICK CREATE 來建立一個空的網站, 建好之後, 進到管理介面中的 configuration 可以看到預設的 .net framework version 是 4.5, php 是 5.3 的版本.

另外若需要用 ftp 管理, 要到 Dash board 中, 點右邊的 setup git publishing, 也就是 git publishing 和 ftp 都用一樣的帳號密碼, 詳情可以參考這篇:

http://blog.syntaxc4.net/post/2012/09/13/enabling-php-5-4-in-windows-azure-web-sites.aspx

這樣就可以利用 ftp 來進行檔案的上傳及管理了. 由於站台是可以執行 asp.net 及 php, 筆者也上傳了 asp 的檔案測試, 也是可以執行的, 有興趣的朋友們可以試看看這個 Windows Azure 提供的免費 3個月試用服務.

若是用量(QUOTA)超過, 預設是不會扣款, 只是服務會暫停, 測試的網站應該不太會這麼快就用完吧, 好好試用看看吧!

若是網站要自訂網域, 則必須在 SCALE 那裡將模式由 free 設為 shared 或 reserved 才行, 可以參考這篇: http://www.windowsazure.com/en-us/develop/net/common-tasks/custom-dns-web-site/

3種程式支援 sample:
php: http://w3.azurewebsites.net/1.php
asp: http://w3.azurewebsites.net/1.asp
aspx: http://w3.azurewebsites.net/1.aspx

快試看看吧!

ServerXMLHTTP及XMLHTTP的差別

暫時將這個分類放在 asp 中.
一般在 client side 的 ajax 會用到這個 component (for IE) Microsoft.XMLHTTP, 若是在 server 端的 asp 程式碼使用這組 code, 來訪問其他站台的內容時, 可以利用程式碼如下:

Set xmlhttp = Server.CreateObject("Microsoft.XMLHTTP")
xmlhttp.Open "GET", "https://diary.tw/tim/", False
xmlhttp.Send
Response.Write xmlhttp.ResponseTEXT
Set xmlhttp = Nothing

不過這個有一些些問題, 因為 XMLHTTP 本身的工作行為是綁在 IE API 上, 當然是有好有壞, 根據微軟的文件, 這組元件是適合用在客戶端而非 server 端, 在使用上會有一些穩定及效能的問題, 不過更有趣的還有一個地方, 就是他會增進效能而在本機的檔案系統上存入訪問的內容, 路徑如下:

C:\WINDOWS\Temp\Temporary Internet Files\Content.IE5

自訂host的方式進行webrequest (ASP)

XML HTTPRequest , 是 ajax 的一個重要元件, 不過一直有一個問題就是指定 Request Header 的這個部分, 在 XML HTTPReqeust 裡, 使用 setRequestHeader 的這些 header 有些是可以指定的, 有些是似乎是 read-only 的, 這裡要談的就是 host 這個標題.

在 client side 的狀況下, 這件事似乎是完全不用考慮的, 因為 client-side javascript 在瀏覽器的控制下, 本來就不允許做 crossdomain 的 access 的(這是基於安全性的考量), 即使是相同子網域也一樣, 相關資料可以參考: Javascript的同一父網域下的crossdomain問題. 不過若是在 server side 就不是這樣了, 在 server side 有時可能需要做為 client 的 remoting 或 gateway 的關係, 也會利用相同的方式進行 http reqeust, 在 asp 程式碼中, 若是需要做這個功能, 一樣是起 MSXML2.XMLHTTP 這組 xml webreqeust, 不過仍有指定 host header 的問題, 即使使用了 setRequestHeader “Host”, “bbb.com.tw” 的方式, 仍無法變更原來在 Open 方法內使用的 url 指定為 http://10.10.10.10/xxx 中的 10.10.10.10 的 host header , 不過用 setRequestHeader “Host”, “bbb.com.tw” 也不會有任何錯誤.

這裡將介紹另一組 api 供類似功能, 但又可以指定 Host Header 功能的一組元件, Windows HTTP Services, 這組元件用法幾乎和 MSXML2.XMLHTTP 完全相同, 而且又可以指定 Host, 所以在使用上可以有更多的應用, 例如多主機架構下, 指定 ip 方式訪問主機, 並帶上對應的主機標題(Host Header), 如此一來便能在指定 ip 下的 http 訪問又能加上 host header.

以下為範例程式碼:

Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "GET", "http://192.168.1.1/test.php", false
WinHttpReq.SetRequestHeader "Host", "myurl.com.tw"
WinHttpReq.Send
httprsp = WinHttpReq.ResponseText
Set WinHttpReq = Nothing

這個最大的用途是做測試環境及主機標題限制狀況下使用, 又或多主機(平衡負載)對應時, 要指定訪問固定主機的頁面時會使用到.

如何在ASP內判定BIG5碼中文字

大多數的 asp 應用程式若是在 utf-8 模式下開發, 前面多會有這麼一行:

<%@LANGUAGE=”VBSCRIPT” CODEPAGE=”65001″%>

然而有個很麻煩的事是在處理判定 BIG5 編碼的中文字. 在正常的狀況下, 應該不會用到這樣的功能, 因為無論是 BIG5 或非 BIG5 的中文字都是可以在 UTF-8 的環境下良好並存的, 但若是和一些舊的程式或其他異質環境介接, 就會遇到這種問題, 解決的方式是利用 asp 的 codepage 來轉換內碼後判定即可. 方式如下:

Function IsBig5(strChar)

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

    session.codepage="950"
    Dim lngAsc
    lngAsc = Asc(strChar)
    IsBig5 = (lngAsc >= -23488 And lngAsc <= -14722)
    If Not IsBig5 Then IsBig5 = (lngAsc >= -14016 And lngAsc <= -1579)
    session.codepage="65001"
End Function

列舉asp中session的值

在 web 程式中, 有時會利用 session 來存放一些存在於 session 中的資料, 因為不想放 cookie 在 client 端, 而又非全域的 application 變數, 所以採用 session 將會是一個比較理想的方式.

利用 session 可以存放使用者在該次訪問的變數, 在 session timeout 時或是 session 中斷後, 該 session 即回自動消失. 他使用的基本技術是採用一個 client side 的 cookie 來做對應, 利用這組資訊可以對應出此 session 的變數出來.

接下來我們看如何將所有的在 session 變數內的值都取出來.

For Each key in Session.Contents
  Response.Write key & "=" & Session(key) & "<br>"
Next

利用 Session.Contents 將所有的內容配合 For Each 指令列舉出來, 如此一來便能將該 session 內的所有 key value pairs 找出, 並檢視是否有問題, 方便除錯上使用!

一般在程式寫作時, session 的值往往比較不好取得而不易 debug, 利用這種方式將能有效找出 session 問題值的關鍵.

參考資料:
http://www.w3schools.com/asp/asp_ref_session.asp

ASP中的cache方法

之前介紹了在 ASP.NET 中的 cache 方式, 現在來看看 ASP 中的 cache 方式.

由於 ASP 中沒有內建的 cache 物件, 所以沒辦法利用 ASP 中的內建的方式來進行 cache, 如前篇所言, cache 類似全域物件的 Application , 所以實作 ASP 的 cache 方法, 就是利用 Application 來實作囉.

這裡利用了兩個變數, exp_”cacheToken” 及 data_”cacheToken” 兩個 Application 的變數來進行操作, 程式碼如下:

分類
程式技術

404 HANDLER

瀏覽器遇到web server回應的status code 404相信大家都不陌生, 無論是IIS或是APACHE都一樣, 只要是找不到這個檔案, 就是回應 404 給client囉.

如何handle web的回應, 除了是要有更 friendly 的回應外, 對於網站管理員來說, 更希望獲得哪些檔案是 user 要, 但是 web 上沒有的. 還記得之前有篇網路轉寄的內容, 有個 web server 的404回應網頁很有趣, 自怨自艾半天, 讓人會心一笑, 這就是友善回應的一種應用. 但能將 404用程式做某種方式記錄或是通知方便管理員處理, 相信也是在某些應用下的重要功能(當然要依實際狀況來用, 因為實務上發生404的機會並不低).