2011年12月28日 星期三

Coldfusion如何使用編/解碼

以下程式碼可能需要CF9以上的版本,目前測試 Railo 3.3 可以正常運作。

傳遞資料的時候有時候須要將資料進行編碼或是解碼,

雖然 javascript 可以完成這樣的工作,

但有時候因為隱匿的關係不希望使用者端解譯其運作原理,所以最好是在 Server 端完成。

Coldfusion 可以處理基本的編解碼有三種形式:


  1. Hex:
  2. use the characters 0-9 and A-F to represent the hexadecimal value of each byte; for example, 3A.
  1. UU:
  2. use the UNIX UUencode algorithm to convert the data.
  1. Base64:
  2. use the Base64 algorithm to convert the data, as specified by IETF RFC 2045, at www.ietf.org/rfc/rfc2045.txt.


比較常見的大多是 Base64吧。

以下是完整的測試網頁:




<cfsilent><cfscript>
if(not isdefined("tp")){
tp = "";
}
idec = "";
switch(tp){
case "b64dec":
idec = BinaryDecode(ostr, "Base64");
idec = CharsetEncode(idec, "big5");
break;
case "b64enc":
idec = CharsetDecode(ostr, "utf-8");
idec = BinaryEncode(idec, "Base64");
break;
case "Hexdec":
idec = BinaryDecode(ostr, "Hex");
idec = CharsetEncode(idec, "big5");
break;
case "Hexenc":
idec = CharsetDecode(ostr, "utf-8");
idec = BinaryEncode(idec, "Hex");
break;
case "UUdec":
idec = BinaryDecode(ostr, "UU");
idec = CharsetEncode(idec, "big5");
break;
case "UUenc":
idec = CharsetDecode(ostr, "utf-8");
idec = BinaryEncode(idec, "UU");
break;
default:
ostr = "2011/08/25 13:80:49";
}

</cfscript></cfsilent>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>Encoding / Decoding Test Page</title>
</head>

<body>
This page is used to test Coldfusion encoding / decoding.
<h2>Input original Text:</h2>
<form action="coding.cfm" method="post">
<textarea name="ostr" cols="80" rows="5" ><cfoutput>#ostr#</cfoutput></textarea>
<br />Method:
<select name="tp" >
<option value="b64dec">Base64 Decoding</option>
<option value="b64enc" selected="selected">Base64 Encoding</option>
<option value="Hexdec">Hex Decoding</option>
<option value="Hexenc">Hex Encoding</option>
<option value="UUdec">UU Decoding</option>
<option value="UUenc">UU Encoding</option>
</select>
<input type="submit" value="Submit" />
<h2>Output Result Text:</h2>
<textarea name="cstr" cols="80" rows="5"><cfoutput>#idec#</cfoutput></textarea>
<br />

</form>
</body>
</html>


編/解碼主要使用 BinaryEncode 與 BinaryDecode 指令操作,可以在線上說明找到相關用法。

需要注意的是轉換前後的字元集轉換處理,

上面這個測試網頁使用了 CharsetEncode 與 CharsetDecode 來處理字元集的轉換,

於進入 BinaryEncode 編碼前將資料來源 CharsetDecode 解碼二進制模式(binary representation)

於 BinaryDecode 解碼後再將 二進制資料 CharsetEncode 編碼成與HTML charset 相同的字元集

如果你的資料來源是網頁表單的 submit 資料,通常是 utf-8 的編碼( 尤其是java系列的 http server ),

但若是資料來源是資料庫的中文字集,就需要注意了:

DBCS系統的資料庫,通常都使用 big5 來 decoding
Unicode系統資料庫則視SQL輸出看是 utf-16 或是 utf-8

因此,使用前必須先測試您的資料來源與輸出來源是否為正確的編碼方式,才能正常運作。

至於字元轉二進制可以編解碼的種類就參考 java 支援的種類(A / B)即可。

0 個回應: