2015年9月1日 星期二

[ASP.NET] 讓 Textbox 按 ENTER 時 postback 失效

So here is the neat and simple trick that does it. And the textbox below is the one that does not do a postback when enter key is pressed inside it
<asp:TextBox ID="TextBox1" runat="server"
   onkeydown = "return (event.keyCode!=13);" >
</asp:TextBox>

As you will notice above I wrote a simple condition on onkeydown event.
(event.keyCode!=13);
When enter key is pressed the above condition is false hence false is returned this the postback is disabled.
Note that Visual Studio will give a warning when you add onkeydown event and underline it with green.
It is just a warning and one can ignore that since Visual Studio searched for Server Side events and onkeydown is not in the list. Hence still it will work
But for those who do not want that warning can add this event from code behind

C#
TextBox1.Attributes.Add("onkeydown""return (event.keyCode!=13);");

VB.Net
TextBox1.Attributes.Add("onkeydown""return (event.keyCode!=13);")

The above line will add the onkeydown event to the textbox. Make sure you add these lines to page load.

In order to disable the enter key form submission on all controls simply add it to the body tag in the following way
<body onkeydown = "return (event.keyCode!=13)">

2015年8月31日 星期一

[SQL] 查詢資料庫實體檔案位置

--查詢資料庫實體檔案位置
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'資料庫名稱');


--ALTER DATABASE DB_NAME SET OFFLINE; 設離線

2015年8月27日 星期四

[Javascript] substr() & substring()

w3c substr()的解釋:
Extracts the characters from a string, beginning at a specified start position, and through the specified number of character.
簡單的講就是,指定開始位置與需要的長度抽取出子字串。index0開始。
語法:
"somestring".substr(start, length)
例子:
alert("12345".substr(2,3)); //會印出345
w3c substring()的解釋:
Extracts the characters from a string, between two specified indices.
substring()則是抽取出兩個index之間的子字串。index0開始。
語法:
"something".substring(from, to)

例子:
alert("12345".substring(2,3)); //會印出3

[Java Script] isNaN() 函數:判斷是否是非數值

定義和用法
isNaN() 函數用於檢查其參數是否是非數值。

語法:
isNaN(x)


參數: x

描述: 必需值。要檢測的值。

提示:isNaN() 函數通常用於檢測 parseFloat() 和 parseInt() 的結果,以判斷它們表示的是否是合法的數字。當然也可以用 isNaN() 函數來檢測算數錯誤,比如用 0 作除數的情況。

實例
isNaN();                   //返回 false
isNaN(0/0);                //返回 true 
isNaN(parseInt("3"));      //返回 false
isNaN(parseInt("hello"));  //返回 true 
isNaN("3");                //返回 false
isNaN("hello");            //返回 true 
isNaN(true);               //返回 false
isNaN(undefined);          //返回 true
如果 x 是特殊的非數位值 NaN(或者能被轉換為這樣的值),返回的值就是 true。
如果 x 是其他值,則返回 false。isNaN() 函數可用於判斷其參數是否是 NaN,該值表示一個非法的數字(比如被 0 除後得到的結果)。
如果把 NaN 與任何值(包括其自身)相比得到的結果均是 false,所以要判斷某個值是否是NaN,不能使用 == 或 === 運算符。
正因為如此,isNaN() 函數是必需的。

[Javascript] 正則替換去除字串中特定符號

用Javascript替換掉字串中的特殊符號

function clearString(s){ 
    var pattern = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()&;|{}【】‘;:”“'。,、?]"
    var rs = ""
    for (var i = 0; i < s.length; i++) { 
        rs = rs+s.substr(i, 1).replace(pattern, ''); 
    } 
    return rs;  


想要過濾的字串在 RegExp()中自己進行設定,中文和英文的特殊符號可以替換。

[Javascript] 正規表示式

規則及運算符號

「*」符合 0 項以上

「|」符合 0 或 1 項以上

「+」符合 1 項以上

「?」符合 0 到 1 項



「( )」組合及排定運算順序

「[ ]」可接受出現的字元定義符號

「{ }」設定長度

「/ /」宣告 PCRE 正規表達式

「^ $」起始與結尾字符

「.」萬用字元,代表任何文字

「\」特殊字元 ^.$()|*+?{\ 前面必須加上此轉移字元



正規表達式範例


{2,4}、{3}、{3,}
分別代表 2-4 個字元、3個字元、3個以上字元

[a-z]
代表小寫英文

[A-Z]
代表大寫英文

[^A-Z]
代表大寫英文字母以外

[A-Za-z0-9_]
代表接受大小寫英數及符號

[A-Za-z]
代表大小寫英文

[0-9]
代表數字

[^0-9]
代表數字以外

[0-9A-Za-z]
代表英文大小寫及數字

[^A-Za-z0-9]
代表英文大小寫及數字以外

PCRE 正規表達式


\d
代表數字,等於 [0-9]

\D
代表數字以外,等於 [^0-9]

\w
代表包含底線的英文大小寫及數字,等於 [A-Za-z0-9_]

\W
代表包含底線英文大小寫及數字以外,等於 [^A-Za-z0-9_]

\b
代表一個單詞邊界,也就是指單詞和空格間的位置。
例如, ya\b 等於 “nahoya” 中的 ya,但不等於 “nahoyabe” 中的 ya

\B
代表非單詞邊界。
例如,ya\B 等於 “nahoyabe” 中的 ya,但不等於 “nahoya” 中的 ya

\s
代表非字元的對象,如 空白 及 Tab,等於 [ \f\n\r\t\v]

\S
代表非字元的對象以外,等於 [^ \f\n\r\t\v]

\n
代表換行字元

\t
代表 TAB

\/
代表反斜線 /

PCRE 正規表達式修改器


/…/i
忽略大小寫


/…/e
當成指令處理 

2013年10月17日 星期四

[JavaScript] trim函數大賞


W3C那幫人的腦袋被驢踢了,直到javascript1.8.1才支持trim函數(與trimLeft,trimRight),可惜現在只有firefox3.5支持。由於去除字符串兩邊的空白實在太常用,各大類庫都有它的影子。加之,外國人都很有研究精神,搞鼓了相當多實現。

實現1

 String.prototype.trim = function() {
  return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
} 
看起來不怎麼樣,動用了兩次正則替換,實際速度非常驚人,主要得益於瀏覽器的內部優化。一個著名的例子字符串拼接,直接相加比用Array做成的StringBuffer還快。 base2類庫使用這種實現。

實現2

 String.prototype.trim = function() {
  return this.replace(/^\s+/, '').replace(/\s+$/, '');
} 
和實現1很相似,但稍慢一點,主要原因是它最先是假設至少存在一個空白符。 Prototype.js使用這種實現,不過其名字為strip,因為Prototype的方法都是力求與Ruby同名。

實現3

 String.prototype.trim = function() {
  return this.substring(Math.max(this.search(/\S/), 0),this.search(/\S\s*$/) + 1);
} 
以截取方式取得空白部分(當然允許中間存在空白符),總共調用了四個原生方法。設計得非常巧妙,substring以兩個數字作為參數。 Math.max以兩個數字作參數,search則返回一個數字。速度比上面兩個慢一點,但比下面大多數都快。

實現4

 String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g, '');
} 
這個可以稱得上實現2的簡化版,就是利用候選操作符連接兩個正則。但這樣做就失去了瀏覽器優化的機會,比不上實現3。由於看來很優雅,許多類庫都使用它,如JQuery與mootools

實現5

 String.prototype.trim = function() {
  var str = this;
  str = str.match(/\S+(?:\s+\S+)*/);
  return str ? str[0] : '';
} 
match是返回一個數組,因此原字符串符合要求的部分就成為它的元素。為了防止字符串中間的空白符被排除,我們需要動用到非捕獲性分組(?:exp)。由於數組可能為空,我們在後面還要做進一步的判定。好像瀏覽器在處理分組上比較無力,一個字慢。所以不要迷信正則,雖然它基本上是萬能的。

實現6

 String.prototype.trim = function() {
  return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, '$1');
} 
把符合要求的部分提供出來,放到一個空字符串中。不過效率很差,尤其是在IE6中。

實現7

 String.prototype.trim = function() {
  return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, '$1');
} 
和實現6很相似,但用了非捕獲分組進行了優點,性能效之有一點點提升。

實現8

 String.prototype.trim = function() {
  return this.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
} 
沿著上面兩個的思路進行改進,動用了非捕獲分組與字符集合,用?頂替了*,效果非常驚人。尤其在IE6中,可以用瘋狂來形容這次性能的提升,直接秒殺火狐。

實現9

 String.prototype.trim = function() {
  return this.replace(/^\s*([\S\s]*?)\s*$/, '$1');
} 
這次是用懶惰匹配頂替非捕獲分組,在火狐中得到改善,IE沒有上次那麼瘋狂。

實現10

 String.prototype.trim = function() {
  var str = this,
  whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
  for (var i = 0,len = str.length; i < len; i++) {
    if (whitespace.indexOf(str.charAt(i)) === -1) {
      str = str.substring(i);
      break;
    }
  }
  for (i = str.length - 1; i >= 0; i--) {
    if (whitespace.indexOf(str.charAt(i)) === -1) {
      str = str.substring(0, i + 1);
      break;
    }
  }
  return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
} 
我只想說,搞出這個的人已經不是用牛來形容,已是神一樣的級別。它先是把可能的空白符全部列出來,在第一次遍歷中砍掉前面的空白,第二次砍掉後面的空白。全過程只用了indexOf與substring這個專門為處理字符串而生的原生方法,沒有使用到正則。速度快得驚人,估計直逼上內部的二進制實現,並且在IE與火狐(其他瀏覽器當然也毫無疑問)都有良好的表現。速度都是零毫秒級別的。

實現11

 String.prototype.trim = function() {
  var str = this,
  str = str.replace(/^\s+/, '');
  for (var i = str.length - 1; i >= 0; i--) {
    if (/\S/.test(str.charAt(i))) {
      str = str.substring(0, i + 1);
      break;
    }
  }
  return str;
} 
實現10已經告訴我們普通的原生字符串截取方法是遠勝於正則替換,雖然是複雜一點。但只要正則不過於復雜,我們就可以利用瀏覽器對正則的優化,改善程序執行效率,如實現8在IE的表現。我想通常不會有人在項目中應用實現10,因為那個whitespace實現太長太難記了(當然如果你在打造一個類庫,它絕對是首先)。實現11可謂其改進版,前面部分的空白由正則替換負責砍掉,後面用原生方法處理,效果不遜於原版,但速度都是非常逆天。

實現12

 String.prototype.trim = function() {
  var str = this,
  str = str.replace(/^\s\s*/, ''),
  ws = /\s/,
  i = str.length;
  while (ws.test(str.charAt(--i)));
  return str.slice(0, i + 1);
} 
實現10與實現11在寫法上更好的改進版,注意說的不是性能速度,而是易記與使用上。和它的兩個前輩都是零毫秒級別的,以後就用這個來工作與嚇人。
下面是老外給出的比較結果,執行背景是對Magna Carta 這文章(超過27,600字符)進行trim操作。
實現Firefox 2IE 6
trim115ms< 0.5ms
trim231ms< 0.5ms
trim346ms31ms
trim447ms46ms
trim5156ms1656ms
trim6172ms2406ms
trim7172ms1640ms
trim8281ms< 0.5ms
trim9125ms78ms
trim10< 0.5ms< 0.5ms
trim11< 0.5ms< 0.5ms
trim12< 0.5ms< 0.5ms
原文鏈接:http://blog.stevenlevithan.com/archives/faster-trim-javascript

2013年7月31日 星期三

[C#] String常用技巧整理(IndexOf、LastIndexOf、Substring、Split)


String.IndexOf

String.IndexOf 方法 (Char, Int32, Int32)
報告指定字符在此範例中的第一個匹配項的索引。搜索從指定字符位置開始,並檢查指定數量的字符位置。
String.IndexOf(value, startIndex, count)

參數
value:要查找的 Unicode 字符。
startIndex:搜索起始位置。
count:要檢查的字符位置數。
返回值(Int32):
如果找到該字符,則為value 的索引位置;否則如果未找到,則為-1。

範例:
string str = "深圳市盈基實業有限公司國際通鄧事文*深圳市盈基實業有限公司國際通鄧事文";
Label1.Text = str.IndexOf("中國").ToString();//返回-1
Label1.Text = str.IndexOf("盈基").ToString();//返回3
Label1.Text = str.IndexOf("盈基",10).ToString();//返回21 說明:這是從第10個字符開始查起。
Label1.Text = str.IndexOf("鄧",15,10).ToString();//返回-1
Label1.Text = str.IndexOf("鄧",15,20).ToString();//返回-32 說明:從第15個字符開始查找,
要查找的範圍是從第15個字符開始後20個字符,即從第15-35個字符中查找。

<---------------------------------------------------------------------------------------------------------->

String.LastIndexOf

String.LastIndexOf 方法
報告指定的Unicode 字符或String 在此實例中的最後一個匹配項的索引位置。


名稱 說明
String.LastIndexOf (Char)報告指定Unicode 字符在此實​​例中的最後一個匹配項的索引位置。
String.LastIndexOf (String)報告指定的String 在此實例內的最後一個匹配項的索引位置。
String.LastIndexOf (Char, Int32)報告指定Unicode 字符在此實​​例中的最後一個匹配項的索引位置。該搜索從指定字符位置開始。
String.LastIndexOf (String, Int32)報告指定的String 在此實例內的最後一個匹配項的索引位置。該搜索從指定字符位置開始。
String.LastIndexOf (String, StringComparison)報告指定字符串在當前String 對像中最後一個匹配項的索引。一個參數指定要用於指定字符串的搜索類型。
String.LastIndexOf (Char, Int32, Int32)報告指定的Unicode 字符在此實​​例內的子字符串中的最後一個匹配項的索引位置。搜索從指定字符位置開始,並檢查指定數量的字符位置。
String.LastIndexOf (String, Int32, Int32)報告指定的String 在此實例內的最後一個匹配項的索引位置。搜索從指定字符位置開始,並檢查指定數量的字符位置。
String.LastIndexOf (String, Int32, StringComparison)報告指定字符串在當前String 對像中最後一個匹配項的索引。參數指定當前字符串中的起始搜索位置,以及要用於指定字符串的搜索類型。
String.LastIndexOf (String, Int32, Int32, 
StringComparison)
報告指定的String 對像在此實例內的最後一個匹配項的索引位置。參數指定當前字符串中的起始搜索位置、要搜索的當前字符串中的字符數量,以及要用於指定字符串的搜索類型。



範例:
string str = "深圳市盈基實業有限公司國際通鄧事文*深圳市盈基實業有限公司國際通鄧事文";
Label1.Text = str.LastIndexOf("鄧文").ToString();//返回-1
Label1.Text = str.LastIndexOf("鄧").ToString();//返回32

Label1.Text = str.LastIndexOf("鄧",8).ToString();//返回-1
Label1.Text = str.LastIndexOf("鄧",20).ToString();//返回14
Label1.Text = str.LastIndexOf("鄧",33).ToString();//返回32
說明:在指定的範圍內查找字符,這個範圍是上面的輸入的參數,
理解為,從索引0開始到指定的數值位置範圍內查找最後一個匹配的的字符串的位置。示例中,0-8中沒有“鄧”字,
所以返回-1,0-20範圍中,有一個“鄧”字在索引14位置上,0-33範圍中有兩個“鄧”字,
因為LastIndexOf是返回最後一個匹配項索引位置,所以返32,而不是14。

PS : IndexOf、LastIndexOf都是返回一個位置,是個整數值;找不到都返回-1;
IndexOf是從左向右查,LastIndexOf是從右向左查,不管是IndexOf還是LastIndexOf,
索引序列都是從左到右的(起始值是0)
<---------------------------------------------------------------------------------------------------------->
String.Substring

String.Substring 方法
從此實例檢索子字符串。
名稱 說明
String.Substring (Int32) 從此實例檢索子字符串。子字符串從指定的字符位置開始。
String.Substring (Int32, Int32) 從此實例檢索子字符串。子字符串從指定的字符位置開始且具有指定的長度。

示例:
string str = "深圳市盈基實業有限公司國際通鄧事文*深圳市盈基實業有限公司國際通鄧事文";
Label1.Text = str.Substring(11);//返回“國際通鄧事文*深圳市盈基實業有限公司國際通鄧事文”
Label1.Text = str.Substring(11,7);//返回“國際通鄧事文*”

<---------------------------------------------------------------------------------------------------------->

String.Split



1,用字符串分隔:


using System.Text.RegularExpressions;

string str="aaajsbbbjsccc";

string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);

foreach (string i in sArray) Response.Write(i.ToString() + "<br>");


輸出結果:
aaa
bbb
ccc

2,用多個字符來分隔:


string str="aaajbbbscccjdddseee";

string[] sArray=str.Split(new char[2]{'j','s'});

foreach(string i in sArray) Response.Write(i.ToString() + "<br>");


輸出結果:
aaa
bbb
ccc
ddd
eee

3,用單個字符來分隔:

字符串str=“aaajbbbjccc”;

字符串[] sArray= str.Split(“J”);

的foreach(字符串sArray我)回复於(i.ToString()+“ - ”);

輸出結果:
aaa
bbb
ccc

轉自:http://a-jau.blogspot.tw/2012/01/cstringindexoflastindexofsubstringsplit.html

2013年5月6日 星期一

[JavaScript] 傳說中的 parseInt('08')

轉自:http://audi.tw/Blog/JavaScript/javascript.parseInt.asp
原文發布時間:6/3 08' 


眾所周知,parseInt() 是用來把字串轉換成整數的函式,一般來說,只要是數字開頭的字串,都能夠轉換成功,例如 parseInt('123a') 的結果為 123,parseInt('12 34') 的結果為12。
關於 parseInt() 有個著名的情況,有些人稱為臭蟲,讓各位自己來評斷。

parseInt('01') 得出的結果是1,事實上,一直到 07 為止,都能得到預期結果,問題來了,parseInt('08') 和 parseInt('09') 這兩者運算的結果,都得到0,這是為什麼呢?

主要原因在於 parseInt() 這個函式,本身可以傳遞兩個參數,語法是:
parseInt(string, radix)
第一個參數 string 當然是要轉換為數字的字串,第二個參數 radix 則是要用二進位、還是八進位或十六進位,又或是最熟悉的十進位來解譯這個字串呢?

也就是說,如果 parseInt('FF',16),代表以 16 進位方式來解析FF這個字串,當然得到的結果就是 255 了,同理,parseInt('FF',10) 以 10 進位來解析FF這個字串,根本就不是數字,所以得到的結果會是 NaN。

但大多數人不會特別指定第二個參數,這時 JavaScript 就自動判斷第一個傳遞的參數是否為某種數字型式。

在 JavaScript 眼中,以 0x 開頭的字串,都視為十六進位字串,如果單單是0開頭,第二個字母不是 x,則視為八進位或二進位字串,
十六進位使用的字母計有 0-9,A-F,而八進位使用的字母則為 0-7,所以,當發生parseInt('08') 又未指定以何種數值型態解析時,JavaScript 以 0 為起頭,接下來的字母又不是 x,那一定是八進位了,但是,八進位裡,怎麼可能有 8 和 9 這兩個字母呢?所以,一定是不合法的字串,於是就傳回 0。

同理,parseInt('010') 回傳的值,也不是 10,而是 8,因為 parseInt() 認為 0 開頭,接下來的字母不是 x,而是 1,就以二進位來解析 010 這個字串,所以一切問題都在於以 0 開頭,所造成的誤會。

最好的解決辦法,就是別偷懶,把第二個參數也加進去,例如 parseInt('08',10)、parseInt('010',10),那就萬無一失了!

2013年4月23日 星期二

「許功蓋」的問題

節錄自http://203.64.20.7/lifetype126/index.php?op=ViewArticle&articleId=15


許功蓋是何許人? 令人頭疼的傢伙
  有人說中國人像一盤散沙,不但不團結又愛搞分化,無論在學校、公司、部隊或社會,小圈圈或小山頭林立,想要中立者很難不被人貼上標籤,一旦被歸類到哪個派系時禍福難料。台海兩岸不就是最明顯的例子,上一代的鬥爭,下一代繼續鬥,非要弄得大家頭破血流為止。
實體和虛擬都在搞分裂
  在電腦的領域裡也一樣,中文字分裂成兩大類;你有你的一套而我也自成一派,現實生活玩分裂遊戲到虛擬世界還在搞,真令老外們百思不得其解?

  常摸電腦的人都知道,台灣和香港這邊號稱自由地區的人,雖然人少卻依然堅持正統的繁體字,統領著五湖四海華人文化界,其精神多麼地偉大呀!這派中文字型編碼以"大五碼(BIG5)"為首。對岸的大陸同胞在文革前,早開始「破四舊、立四新」,所謂的四舊是:“舊思想、舊文化、舊風俗、舊習慣”這些八股東西通通要拋掉,要改革就改的徹底,繁體自筆畫多太麻煩,不符合新的標準。而四新就是指相對應的:「新思想、新文化、新風俗、新習慣」,因此,以後電腦的中文環境都受此意識型態影響,奇怪得是既然統一寫簡體中文,後來簡體中文的編碼又搞出三這種不同派系:「GB18030、GB2312及HZ」,看來中國人真是與眾不同的民族。

  相同地,自由地區的台灣及香港雖同樣都使用大五碼來號令中文字型,妙就妙在我老廣講的粵語要維持我原來語意的精神,又多增加些令台灣人看了莫宰羊的港仔字型,於是,中文字和西方文字一字一位元組的單純性更顯得複雜難懂,英美語系的ASCII Code全球通行無障礙,這也難怪啦!電腦本來就是西方所發明出來的呀!

  相形之下,台灣也單純得多,幾乎人人全用大五碼,可是,如今不是都在全球化,台灣不能搞鎖國,文字總要交流,一有交流網絡一旦離開台灣島後,問題及麻煩也跟著來了。撇開亂碼的問題不談,因為這是先天不良所致沒辦法改變,然而,麻煩的事並不侷限在簡繁中文字的轉換上,就算在台灣普遍使用大五碼環境,一樣會有後天失調的問題出現。

大名鼎鼎的許功蓋

  無論是許功蓋或是許蓋功其實只是本尊與分身的差別不同,意思是在電腦世界裡都代表一個相同問題,我想只要曾經用過"PHP+MySQL"架站過的人,幾乎是無人不知無人不曉這頭疼的傢伙,且絕對是這些架站人心中永遠的痛。仔細探究原因,你會發現,錯的人其實不該是許功蓋,而是通稱大五碼的BIG5碼,關於大五碼的歷史傳說眾說紛紜,無一定論。我們並不評論當初編碼的對錯與是非,對這歷史有興趣的讀者不妨到google搜尋"BIG5″,相信可以找到一堆資料。

  既然大五碼聽來似乎有些問題,為何目前幾乎所有的繁體中文卻又都採用此一編碼呢?在西元1983-1984年間,個人電腦正在台灣逐漸推廣,電腦上的套裝軟體也開始盛行,為了解決電腦處理中文的問題,因而制定一套中文內碼,也就是我們通稱的"BIG5碼",又稱大五碼。而經歷過這段時間的人,一定不會忘記當初倚天中文的行銷手法,在國外軟體廠商開始引進原版軟體觀念的當時,倚天中文卻反其道而行,允許校園甚至一般使用者無條件且免費複製其中文系統,因此,讓倚天中文在當時幾乎成為中文的標準,也由於倚天中文正是採用BIG5編碼,嚴格說來,也就是BIG5碼為何一直沿用到現今的主要原因了。

大五碼錯在哪裡?

  錯在編碼時沒有把美國標準資訊交換碼 ASCII(American Standard Code for Information Interchange)的控制碼摒除在外,凡是唸過計算機概論的人都知道ASCII是以位元組(byte)為單位,又1 byte=8 bits,所以ASCII最多可以編2^8=256個字元,對於只有26個字母的英文語系國家來說已綽綽有餘,但對於有幾萬字的中文絕對不夠,因此必須用兩個byte來代表一個中文字,如"中"字的編碼即是"A4A4″。然而,BIG5碼設計時為了避免與ASCII衝突,每個中文字的第一個byte僅使用 ASCII裡的高字元(129-255),但在第二個byte卻用到了部分低字元(1-128),這正是BIG5碼在日後應用上造成極大不便的最大幫兇了。

BIG5不只找php麻煩,連UNIX都倖免於難

  7C 是 ASCII 裡的 pipe ‘|’ 用過 UNIX的人應該知道它是作什麼的,舉一個簡單的例子,如果你用 FTP 上傳一個 “四.doc” 的檔名到 UNIX 作業系統 ,傳完後立刻變成 “北.doc’,我想有太多人碰過這種經驗,原因無他,中文字 “四” 的 BIG5 碼是"A57C",當 UNIX 看到 7C 時會覺得莫名其妙,上傳一個 “|” 給我做什麼?於是就自己處理掉了…

  因此,你可以想像只要是中文字第二個byte是 “7C” 的,保證也都難逃BIG5的魔掌。

許功蓋的解決之道

  一、去除程式裡出現問題那段程式碼裡的STRIPSLASHES函數,如此,除了顯示"許蓋功"時可能變成"許蓋功"之外,似乎也沒太大的問題,但是,MySQL Server的隱碼及跳脫字元問題還是存在的。

  二、使用big5_func字串處理函數集

  當你決定使用big5_func來處理時,就必須將mysql的charset也一併改為BIG5,切記千萬不可讓許、功、蓋等字放在要插入資料字串的最後面。還有一個比較嚴重的問題是,變更charset是必須重新編譯mysql的,也就是說如果你是已經運作正常的主機,必須重新安裝MySQL Server並加入 charset=big5 的參數,若如果你是租用的虛擬主機,那問題就會變得更為複雜,因為主機供應商通常不會特別因為你要使用big5_func的函數而重新去編譯他們的資料庫系統。

  幸虧得是網絡上資源浩瀚無窮,可以搜尋繁體中文OSC版本,僅針對MySQL的charset為latin1的一些修正資料。由於BIG5所造成的問題幾乎無所不在,筆者認為除非BIG5有一個完整的補救計劃,否則許功蓋將會一直困擾著所有用PHP+MySQL架站的人,相信網絡上許多熱心的高手可以來解決BIG5的問題。或者,省得這麼多的麻煩乾脆全部改採萬國碼(Unicode),值得高興的是MySQL終於從善如流接受雙字元,自 v4.1版 以上已經支援 UTF-8 編碼了,真是可喜可賀,造福華人世界呀!

附錄:
BIG5碼中容易衝碼的文字:
(請注意看你的內文是否用到了下列的字:)

ASCII(5C) == “”
A45C么 AE5C娉 B85C稞 C25C擺 A55C功
AF5C珮 B95C鈾 C35C黠 A65C吒 B05C豹
BA5C暝 C45C孀 A75C吭 B15C崤 BB5C蓋
C55C髏 A85C沔 B25C淚 BC5C墦 C65C躡
A95C坼 B35C許 BD5C穀 AA5C歿 B45C廄
BE5C閱 AB5C俞 B55C琵 BF5C璞 AC5C枯
B65C跚 C05C餐 AD5C苒 B75C愧 C15C縷
ASCII(7C) == “|”
AA7C泜 B47C揉 A87C育 BE7C魯 B27C琍
BC7C慝 C67C鸛 A97C尚 B37C逖 BD7C罵
A77C坑 B17C悴 BB7C誡 C57C疊 A67C帆
B07C院 BA7C漏 C47C辮 AB7C咽 B57C稅
BF7C糕 AC7C洱 B67C閏 C07C嚐 AD7C迢
B77C會 C17C舉 A47C弋 AE7C徑 B87C腮
C27C甕 A57C四 AF7C砝 B97C頌 C37C牘

2013年3月27日 星期三

XP無法進入系統,一直重開機


1.首先準備好原版XP光碟(不要用網路上人家重新包裝、整合過的)
2.以光碟開機,如同系統安裝
3.選擇r,修復系統
4.進入DOS後,輸入CHKDSK(檢查系統磁碟)
5.檢查完出現錯誤訊息
6.再次輸入
CHKDSK /r
7.等100%後及修復完成,重新開機。

2012年10月7日 星期日

CentOS 5下Yum安装本地光盘软件



首先 要先挂载光盘,把光盘挂载到media/CentOS/,media/cdrom/,或者media/cdrecorder/ 这样就不用修改配置文件了。如果想挂载到其他目录,只要修改下baseurl=file:///自己挂载的目录,就可以了。配置文件在 /etc/yum.repos.d/CentOS-Media.repo。

接着 把/etc/yum.repos.d/CentOS-Base.repo改下名,命令如下:
QUOTE:
#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

检查下配置文件的有没设置正确,命令如下:
QUOTE:
#cat /etc/yum.repos.d/CentOS-Media.repo
# CentOS-Media.repo
#
# This repo is used to mount the default locations for a CDROM / DVD on
# CentOS-5. You can use this repo and yum to install items directly off the
# DVD ISO that we release.
#
# To use this repo, put in your DVD and use it with the other repos to
# yum --enablerepo=c5-media [command]
#
# or for ONLY the media repo, do this:
#
# yum --disablerepo=\* --enablerepo=c5-media [command]

[c5-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-beta

其实配置文件中已经有教怎么做的了,我好像是多此一举了。

最后 就是要安装软件咯,命令如下:
#yum --enablerepo=c5-media install gimp

安装你想要的软件。

CENTOS 下搭建配置VNC服务器



最近要用到在linux实现桌面共享,于是想到使用VNC。这个网上有很多教程,我们从头开始:
1.安装linux版的vnc

  (1)安装


tar zxvf vnc-3.3.3r1_x86_linux_2.0.tgz
cd vnc_x86_linux_2.0
cp *vnc* /usr/local/bin/
mkdir /usr/local/vnc
cp -r classes/ /usr/local/vnc/



  (2)设置vnc server的访问密码


vncpasswd



  (3)启动vnc server


vncserver



  注意运行后显示的信息,记下所用的端口号,一般从1开始,因为0被x server占用了.现在,你就能提供vnc服务了.vnc client的用法等会介绍.

  2、安装nt版的vnc

  1)安装

  解开vnc-3.3.3r7_x86_win32.zip包后,会产生winvnc和vncviewer两个目录.winvnc目录中是vnc server的安装程序,vncviewer目录中是vnc client的安装序.我只关心vnc server,在winvnc目录中执行setup即可.

  2)设置

  首先执行install default registry settings.

  run winvnc(app mode)就是执行vnc server

  这时可看到winvnc运行的小图标,用鼠标右键点击图标,在properties/incoming connections中设定密码.默认配置即可.

  现在,你的nt就能提供vnc服务了.

  3、使用vncviewer

  vnc server启动成功后,你就可用vncviewer来远程控制桌面了.


vncviewer xxx.xxx.xxx.xxx:display number



  例如,vncviewer 172.16.1.2:1

  按要求输入密码就可以看到远程的桌面了.

  注意:viewers需要在16位色的显示模式下工作,如果您的操作系统中没上16位色,那么请您及时的调整您计算机的显示模式。不然vncviewer无法正常工作。
这个实现的是远程桌面控制,但是这个一个桌面只能连接一个客户端,所以,如果要让多人连接服务器,可以在服务端启用以下命令:
xserver --passwordfile=/root/.vnc/passwd
然后客户端直接运行:
vncviewer serverIP就可以了,不用加上桌面号,这个环境下,客户端可以看到服务端的操作。
Linux学习网收集整理 ,(如果您觉得本站不错,请告诉身边的朋友,或转载到论坛、百度知道、贴吧等,记得带网址哟,不胜感激!)。

轉自:http://www.5dlinux.com/article/1/2011/linux_43459.html

2012年10月5日 星期五

解決在Hyper-V安裝CentOS 遠端桌面滑鼠不能動的問題


解決在Hyper-V安裝CentOS遠端桌面滑鼠不能動的問題


01# 設定網路(在Hyper-V設定用"傳統網路介面卡")
02# yum install kernel-devel gcc
03# rm /lib/modules/2.6.18-164.el5/build (目錄有可能會不一樣)
04# ln -s /usr/src/kernels/2.6.18-164.15.1.el5-x86_64/ /lib/modules/2.6.18-164.el5/build
05# 放光碟
06# cp -rp /media/driver /opt (目錄不一定是"/media/driver",可用mount指令查)
07# cd /opt/driver/LinuxICv2
08# ./setup.pl drivers
09# cd /opt/driver/inputvsc
10# ./setup.pl inputdriver

2012年8月15日 星期三

[Javascript] 密碼欄位提示文字"password"


SCRIPT:
script language="javascript">
 function changeBox()
 {
    document.getElementById('div1').style.display='none';
    document.getElementById('div2').style.display='';
    document.getElementById('password').focus();
 }
 function restoreBox()
 {
    if(document.getElementById('password').value=='')
    {
      document.getElementById('div1').style.display='';
      document.getElementById('div2').style.display='none';
    }
 }
/script>

FORM:

div id="div1">
input name="pass_temp" type="text" value="Password" size="20"
maxlength="20" onfocus="changeBox()" />
/div>
div id="div2" style="display:none">
input name="password" id="password" type="password" value="" size="20"
maxlength="20" onBlur="restoreBox()" />
/div>

2012年6月28日 星期四

[ASP] ADODB.Stream讀取檔案(效果如FSO)


讀出
<%
set stm=server.CreateObject("adodb.stream")
stm.charset="UTF-8"
stm.Open
stm.loadfromfile filepath '路徑
foslist=stm.readtext  '內容
stm.Close
set stm=nothing
%>
寫入
<%
Set stm = server.createobject("ADODB.Stream")
stm.Charset = "UTF-8"
stm.Open
stm.WriteText dsvd & foslist '內容,1換行
stm.SaveToFile filepath, 2  '路徑
stm.Close
set stm=nothing
%>

2012年6月22日 星期五

[Javascript] getElementsByClassName | getElementById 失效 IE 8 失效?

在制作记忆菜单的时候
我遇到了这个问题:
getElementsByClassName 在火狐下正常,IE下却说不认识这个方法。脚本错误。

查阅了相关资料 发现是因为标准状态下 不认识getElementsByClassName 这个方法。

标准状态下据说有三个方法可以支持:
分别是:
1. 通过顶层document节点获取:
            (1) document.getElementById(elementId):该方法通过节点的ID,可以准确获得需要的元素,是比较简单快捷的方法。如果页面上含有多个相同id的节点,那么只返回第一个节点。
             如今,已经出现了如prototype、Mootools等多个JavaScript库,它们提供了更简便的方法:$(id),参数仍然是节点的id。这个方法可以看作是document.getElementById()的另外一种写法,不过$()的功能更为强大,具体用法可以参考它们各自的API文档。
            (2)document.getElementsByName(elementName):该方法是通过节点的name获取节点,从名字可以看出,这个方法返回的不是一个节点元素,而是具有同样名称的节点数组。然后,我们可以通过要获取节点的某个属性来循环判断是否为需要的节点。
            例如:在HTML中checkbox和radio都是通过相同的name属性值,来标识一个组内的元素。如果我们现在要获取被选中的元素,首先获取改组元素,然后循环判断是节点的checked属性值是否为true即可。
           (3)document.getElementsByTagName(tagName):该方法是通过节点的Tag获取节点,同样该方法也是返回一个数组,例如:document.getElementsByTagName('A')将会返回页面上所有超链接节点。在获取节点之前,一般都是知道节点的类型的,所以使用该方法比较简单。但是缺点也是显而易见,那就是返回的数组可能十分庞大,这样就会浪费很多时间。那么,这个方法是不是就没有用处了呢?当然不是,这个方法和上面的两个不同,它不是document节点的专有方法,还可以应用其他的节点,下面将会提到。
   2、通过父节点获取:
            (1)parentObj.firstChild:如果节点为已知节点(parentObj)的第一个子节点就可以使用这个方法。这个属性是可以递归使用的,也就是支持parentObj.firstChild.firstChild.firstChild...的形式,如此就可以获得更深层次的节点。
           (2)parentObj.lastChild:很显然,这个属性是获取已知节点(parentObj)的最后一个子节点。与firstChild一样,它也可以递归使用。
           在使用中,如果我们把二者结合起来,那么将会达到更加令人兴奋的效果,即:parentObj.firstChild.lastChild.lastChild...
          (3)parentObj.childNodes:获取已知节点的子节点数组,然后可以通过循环或者索引找到需要的节点。
注意:经测试发现,在IE7上获取的是直接子节点的数组,而在Firefox2.0.0.11上获取的是所有子节点即包括子节点的子节点。
          (4)parentObj.children:获取已知节点的直接子节点数组。
注意:经测试,在IE7上,和childNodes效果一样,而Firefox2.0.0.11不支持。这也是为什么我要使用和其他方法不同样式的原因。因此不建议使用。
          (5)parentObj.getElementsByTagName(tagName):使用方法不再赘述,它返回已知节点的所有子节点中类型为指定值的子节点数组。例如:parentObj.getElementsByTagName('A')返回已知的子节点中的所有超链接。
3、通过临近节点获取:
     (1)neighbourNode.previousSibling:获取已知节点(neighbourNode)的前一个节点,这个属性和前面的firstChild、lastChild一样都似乎可以递归使用的。
     (2)neighbourNode.nextSibling:获取已知节点(neighbourNode)的下一个节点,同样支持递归。
4、通过子节点获取:
     (1)childNode.parentNode:获取已知节点的父节点。
   上面提到的方法,只是一些基本的方法,如果使用了Prototype等JavaScript库,可能还获得其他不同的方法,例如通过节点的class获取等等。不过,如果能够灵活运用上面的各种方法,相信应该可以应付大部分的程序


经过本人测试。发现getElementsByName这个东西不好使。甚至我没有成功的使用过。

所以我建议 平时只使用getElementById和getElementsByTagName即可。getElementsByName尽量少用。

我在做记忆菜单的时候要使用getElementsByClassName ,但是IE不支持。怎么办呢?
据说IE8可以支持了。并且现在火狐是支持的,注意我使用的FF3 他是支持这个getElementsByClassName 的。
最后针对IE 专门有写了一段代码来实现getElementsByClassName这个方法
代码如下:

document.getElementsByClassName = function(eleClassName){
  var getEleClass = [];//定义一个数组
  var myclass = new RegExp("\\b"+eleClassName+"\\b");//创建一个正则表达式对像
  var elem = this.getElementsByTagName("*");//获取文档里所有的元素
  for(var h=0;h<elem.length;h++){
    var classes = elem[h].className;//获取class对像
    if (myclass.test(classes)) getEleClass.push(elem[h]);//正则比较,取到想要的CLASS对像
  }
  return getEleClass;//返回数组
}


这样IE这个傻X就会认识getElementsByClassName 这个方法了。

关于记忆菜单的源码请看下一遍日志。