如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2019年4月26日

社會新鮮人注意! 會把你上班努力賺的錢賠光的五件事

作者: Fred F.M. Wang (FW知識瑣記) 日期:20190426

社會新鮮人注意! 會把你上班努力賺的錢賠光的五件事 :
1 作保,絕對絕對不能幫人作保。很多人因為講義氣,幫朋友作保而傾家蕩產。
   新聞:"曾是月入10多萬元的銀行副總,卻因替人作保,傾家蕩產,妻離女,負債好幾百萬元,淪為街友。"

2 賭博,不用說大家都知道。

3 創業,創業成功率低,要有賠光所有投入資金,而且負債的心理準備。據說,創業的公司有九成會在第一年收起來,剩下來的有九成會在五年後倒閉。

4 借錢(給別人),如果真的要借錢,要量力而為,不管利息多高,都可能沒辦法收回來。如果借錢家人或朋友,就要當送他們的,如果還回來,就當是彩券中獎。

5 投資,不要做太高風險的投資,短期利潤越高的投資標的,風險越高。如期貨、選擇權等等的衍生性商品,大多槓桿在十倍以上,可能短期獲利高,但風險極大,很有可能血本無歸。另外,股市投資不做功課,亂聽消息,也很容易賠大錢。

上面是我整理的五點,最容易把你上班努力賺的錢賠光的五件事,其中第1與第2點絕對不要做,否則可能永無翻身之日,當然,還有被詐騙,車禍撞到人等等,也可能會讓您賺的錢賠光,不論如何,記得謹慎小心才能守好自己努力的成果。

2019年4月12日

[中文編碼問題] 繁簡體中文字都可以輸入, 儲存SQL Server DB(2019以前的版本)並顯示在PHP網頁上 (尚無正確的方法)

作者: Fred F.M. Wang (FW知識瑣記) 日期: 20190412

花了一天的時間研究UTF-8網頁繁簡體並存的問題,怎樣讓繁簡體都可以輸入,儲存入資料庫並正確地顯示在網頁上。

有些人覺得很簡單阿,只要將網頁上輸入的UTF-8繁或簡體中文字串,直接儲存進以UTF-8編碼的資料庫資料欄位就可以了,反之,從資料庫讀取也很直接,沒問題的。

問題出在資料庫,我在mysql資料庫,用上面方式存取,繁體簡體字都沒問題。 但是使用MS SQL Server就是不行。

如果要直接儲存UTF-8不要轉碼, 在SQL Server(2019以前的版本)中辦得到嗎? 答案是否定的。

找到一篇微軟官網的文章  "說明SQL Server 中儲存 UTF-8 資料", 提到"某些應用程式 (特別是 Web 應用程式) 必須處理以 UTF-8 編碼方法所編碼的 Unicode 資料。SQL Server 7.0 和 SQL Server 2000 使用不同的 Unicode 編碼方式 (UCS-2),無法將 UTF-8 識別為有效的字元資料。" , "Microsoft Windows NT、SQL Server、Java、COM 和 SQL Server ODBC 驅動程式以及 OLEDB 提供者在內部都以 UCS-2 代表 Unicode 資料。"

SQL Server原來是不支援UTF-8的,直到SQL Server 2019才支援 (微軟終於覺醒了?!)

那麼網頁(UTF-8)儲存入SQL Server DB改用 mb_convert_encoding($data, "UCS-2","UTF-8"); 轉成UCS-2編碼儲存到DB中,從SQL Server DB讀出顯示到網頁(UTF-8)時, 用 mb_convert_encoding($data,"UTF-8", "UCS-2"); 轉成UTF-8顯示。
這樣是否就可行了呢?  結果還是失敗, 仍然無法正確轉換所有的繁簡中文。





感謝internet上許多網友無私分享許多的文章,讓自己找到不少線索,不過可能因為環境不同,需要花一些時間嘗試,找到合適的方法來解決這個問題。

我的系統環境

資料庫 : MS SQL Server 2008
資料庫編碼(SQL Server定序) : Chinese_Taiwan_Stroke_BIN

Web System : PHP + Codeigniter
Web System編碼 : UTF-8


方法 :
1 將會輸入中文字的欄位編碼由Chinese_Taiwan_Stroke_CI_AS改為Chinese_PRC_CI_AS (當然, 欄位型態必須是nchar, nvarchar, ntext這種帶n開頭的型態)

2  儲存時判斷轉入的字串是不是簡體字,如果是就用mb_convert_encoding($inputstr,"cp936", "UTF-8") 轉為cp936碼, 否則視為繁體字 用mb_convert_encoding($inputstr,"BIG5", "UTF-8") 轉為BIG5碼 再儲存到資料庫中
*** 簡體字判斷方法 : 參考 "PHP 判斷 UTF-8 字串是 簡體 或 繁體中文"

3 由資料庫讀出時判斷是不是簡體字,如果是就用mb_convert_encoding($data, "UTF-8", "CP936")轉為UTF-8顯示,否則視為繁體字 用mb_convert_encoding($data, "UTF-8", "BIG5")轉為UTF-8顯示
    判斷方法 :  用mb_detect_encoding
function encode($str) {
 $codes = array("ASCII","GB2312","BIG5","UTF-8");
 $encode = mb_detect_encoding($str,$codes); 
 return $encode;
}
 
結果 :
1 繁簡體中文都可以儲存到DB中
2 "測試" 未判斷成繁體字, 轉成簡體字"代刚", "知識"也沒有正確判斷是BIG5, 變成亂碼

問題關鍵是如何判斷從資料庫讀出的文字是繁體字或簡體字? 用mb_detect_encoding顯然無法正確判斷

20190415
用不同編碼的字串長度來實驗, 如下 :

 發現從判斷從資料庫讀出的字串,如果是繁體中文字串, mb_strlen($data, "UTF-8")與mb_strlen($data, "CP950")的結果不同, 而簡體中文字串則相同,因此, 可已根據這種規則判斷是簡體中文或繁體中文。

我找到方法了, 修改上面第三點,判斷字串長度

$len1 = mb_strlen($str, "UTF-8");
$len2 = mb_strlen($str, "CP950");
if($len1 === $len2) { // 簡體字  
 $code = "CP936";
} else {   // 繁體字
 $code = "BIG5";
} 

如上面方式, 兩種長度相等表示是簡體字, 不相等表示是繁體字
判斷出來後再 將資料轉成UTF-8 ==> mb_convert_encoding($data, "UTF-8", $code);
這樣就正確了 (限目前我測試的內容)



以上為目前測試的結果, 但是不表示所有的中文字都能100%的辨別, 筆者發現更長的字串,上面判斷法則就會失敗, 還需要更多的測試與修正, 另外, 繁簡夾雜的字串也會有問題

筆者最後決定資料庫改在mySQL,就不會有此傷腦筋的問題了。使用SQL Server 2008也可以升級為SQL Server 2019就沒這個問題了。-20190426 Fred


相關文章 :
1. [繁簡中文並存問題]PHP Web應用系統繁簡中文並存問題研究
2. [繁簡中文並存問題]網頁應用上傳檔案檔名變成亂碼的解決方法

2019年4月9日

如何設計一個流程管理系統(BPM) - 設計概念

作者: Fred F.M. Wang (FW知識瑣記) 日期: 20190211  rev: 20190409

筆者最近自行設計一個基礎的流程平台,在此分享一個Workflow平台該具備哪些基礎的資料模型,提供大家設計的參考。

列出下列幾項 :

1. 流程定義 : 用來定義要建立的流程基本資料,包含流程代碼,名稱,類別,系統說明文件連結,上線日期,是否停用等

2. 流程角色 :用來定義流程參與者的角色。用於流程的權限控管。

3. 關卡定義 : 用來定義流程有哪些關卡,包含流程代碼,關卡代碼,名稱,描述,母關卡代碼(用於會簽),有權執行關卡的角色/部門/或表單欄位名稱(填單時指定)/使用者帳號/...等。注意 : 關卡權限的設計需要保持彈性,可以是流程設定的角色,或組織表中的頭銜或特定部門主管,或在表單中指定,或固定使用者,角色也可能在表單中指定,特定部門也可能在表單中指定。

4. 關卡催簽定義 : 定義流程各個關卡的完成期限,與催簽頻率(一次,每天一次或兩天一次等)。

5 轉換流定義 : 用來定義一個關卡執行甚麼動作會到哪一個關卡,包含流程代碼,關卡代碼,動作,下一個關卡代碼。

6 流程個案 : 每一次流程啟動時產生一筆流程個案,也就是流程的實例(instance)。包含: 流程代碼,個案代碼,個案名稱(主旨,專案名稱等),目前關卡代碼,關卡開始時間,目前關卡負責人代碼,個案開始時間,個案結案/中止/作廢時間等。

7 流程節點 : 每執行一個關卡,就會記錄一次流程節點,也就是關卡的實例(instance),對簽核流程而言,就是簽核記錄。包含流程代碼,個案代碼,序號,關卡代碼,開始時間,完成送出時間,實際執行/簽核人,動作名稱,備註/簽核意見等。

8 表單定義與表單欄位定義 : 略。

9 表單欄位關卡控制 : 用來設定在不同關卡,表單中各個欄位是唯讀,隱藏,可填或必填。包含流程代碼,表單編號,欄位名稱,關卡代碼,控制方式(唯讀,隱藏,可填或必填)。

11 表單內容變更記錄 : 重要欄位變更可以記錄在這裡,包含 :流程代碼,個案代碼,表單編號,欄位名稱,變更前內容,變更後內容,變更時間,變更者。
 
12 代理人設定 : 讓使用者指定自己某段時間的流程代理人,包含 使用者代碼,流程代碼,代理人代碼,代理起始日,代理結束日(代理的最後一天)。

設計的概念模型如下 : 


 如果需要還要加上使用者帳號與組織表。

在程式設計前,還需要進行功能模組與資料處理模組的設計,資料處理模組設計,就是實現對上述資料模型存取的函式設計功能模組設計則實現流程系統應具備的功能函式設計。可以提供流程入口網站叫用以及其他流程功能系統內嵌簽核模組。

最後開發 流程入口網站與相關管理功能。系統架構的概念圖如下:

 

Fred F.M. Wang