2013年1月25日 星期五

jsp 送出文字 變亂碼


參考:http://blog.amjet.cc/IT/?p=104

這個問題陸續遇到幾次了,始終知其然而不知其所以然。這是最近一次的處理案例:

環境

OS: CentOS 5.2 (utf-8)

Database: MySQL 5 (utf-8)

Application server: Tomcat 6

網頁

<input type=text name=keyword>

程式

String keyword=request.getParameter(“keyword”);

網頁的 input 輸入中文 submit 後由以上程式碼接取,原本的中文都變成亂碼。解決的方法是改用以下的接取程式碼,將收到的字串重新編碼。

String keyword=new String(request.getParameter(“keyword”).getBytes(“iso8859-1″),”utf-8″);

Why

Tomcat 在處理 GET、POST 參數時預設是採用 ISO-8859-1 編碼,請參考此 網址 URIEncoding 部份的說明,所以第2 段程式才會 work,請隨著您的作業系統及資料庫編碼設定,調整接取參數的程式碼。

Browser

以上的例子是送一個 keyword 到 tomcat web application 查詢資料,後來出現另一個問題,從 Firefox 送出中文的 keyword 可以正確的查到資料,Explorer 卻查不到,經過測試和查詢相關資料後發現,從 Explorer 送出 keyword 前要用 javascript encodeURIComponent() 編碼後再送出才會正常查到資料。

2008.11.27 加註

上面情形是發生在未指定 form 的 method,根據規格預設會以 get 傳送資料,Tomcat 的文件也沒有說明 URIEncoding 是會針對 get 或 post method 作處理。今天又遇到 form submit 中文亂碼問題,這次也不用重新編碼參數了,直接把 form method 設定 post,問題就解決了。看來 submit 的 form 有中文時,用 post method 會是比較好的選擇。

2012年12月9日 星期日

IE7 jquery遇json2.js無效時

XXX 為什麼 IE6 可以自動調用 parse,但在 IE8、FireFox  就是不行 ?????

原來 IE8 與 FireFox(11)已內建原生 JSON  程式,所以 jQuery 會直接調用原生的 JSON.parse,以致上面所述修改 json2.js 的功用皆失效,根本不會叫用 json2.js。

查看 json2.js  程式碼之 162 至 165 來

var JSON;
if (!JSON) {
    JSON = {};
}

即判斷如果已註冊 JSON 物件,則 json2 就不再註冊此功能,為了能使用上面針對日期物件修正的功能,只好把 163、165兩行註解掉,強制 jQuery 使用 jsons2.js 的 JSON 功能!

var JSON;
// if (!JSON) {
    JSON = {};
//}

2012年11月21日 星期三

匯出的excel如果要合併儲存格後排序


將HTML文件的擴展名改為XLS後,用Excel打開,裡邊的每個<br />都會使後邊的文字進入另一個單元格,要使<br />在一個單元格內起到換行的作用,可以在CSS裡加入這一句:
br {mso-data-placement:same-cell;} Excel就會把<br />解釋成回車了。


<style type='text/css'>
br {
mso-data-placement: same-cell;
}
</style>




利用網頁轉出資料到 Excel 上常會遇到想要以文字格式顯示的數字,像是手機號碼、帳號之類的資料,被 Excel 自動轉換成數字格式,於是前面的 0 被省略掉了、帳號變成科學記號了...等等的麻煩,有個方便的方式不會去加入奇奇怪怪的東西到欄位裡面,讓 Excel 不會去判斷成數字,很簡單,只要在 td 裡面加入 style 設定就行了。 

mso-number-format:"0"    NO Decimals
mso-number-format:"0\.000"    3 Decimals
mso-number-format:"\#\,\#\#0\.000"    Comma with 3 dec
mso-number-format:"mm\/dd\/yy"    Date7
mso-number-format:"mmmm\ d\,\ yyyy"    Date9
mso-number-format:"m\/d\/yy\ h\:mm\ AM\/PM"    D -T AMPM
mso-number-format:"Short Date"    01/03/1998
mso-number-format:"Medium Date"    01-mar-98
mso-number-format:"d\-mmm\-yyyy"    01-mar-1998
mso-number-format:"Short Time"    5:16
mso-number-format:"Medium Time"    5:16 am
mso-number-format:"Long Time"    5:16:21:00
mso-number-format:"Percent"    Percent - two decimals
mso-number-format:"0%"    Percent - no decimals
mso-number-format:"0\.E+00"    Scientific Notation
mso-number-format:"\@"    Text
mso-number-format:"\#\ ???\/???"    Fractions - up to 3 digits (312/943)
mso-number-format:"\0022£\0022\#\,\#\#0\.00"    £12.76
mso-number-format:"\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\ "    

2012年10月3日 星期三

php 兩個日期相差幾日



$access_date = "2000/05/27"; 

//explode()函數用一個字串作為分界來分解另一個字串。這個例子$access_date通過字串」/」來分解 

$date_elements = explode("/" ,$access_date); 

// 此時 

// $date_elements[0] = 2000 

// $date_elements[1] = 5 

// $date_elements[2] = 27 

echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]); 



$startdate=mktime("0","0","0","5","3","1998");
$enddate=mktime("0","0","0","6","5","1999");
//所得到的值為從1970-1-1到參數時間的總秒數:是整數.那么
//下面的代碼就好編多了:
$days=round(($enddate-$startdate)/3600/24) ;
//days為得到的天數;
若mktime()中的參數缺省,那表示使用當前日期,這樣便可計算從借書日期至今的天數.


2012年9月25日 星期二

修正郵件標題亂碼



$this->subject = "=?UTF-8?B?" . base64_encode($this->subject) . "?=";
//郵件修正亂碼
就可以正常顯示標題。 不會中斷長標題。

AD 帳戶 到期日 寫入方式(for php)

首先寫入AD 帳戶到期日的欄位是:accountExpires

accountExpires 是以100 nanosecond increment為單位寫入
換算方式如下:



$account_expires_string = (現在的timestamp+ 11644560000) * 10000000;

echo "<br>".$account_expires_string."\n";

$info["accountExpires"] =  account_expires_string  ;

$info["accountExpires"] = 0; =>表示帳號永不到期


2012年9月18日 星期二

php 產生制定格式 日期的做法



產生 一個月之後的日期
echo date_create("+1 month")->format('Y-m-d h:i:s');

產生一天之後的日期
echo date_create("+1 day")->format('Y-m-d h:i:s');