如何檢查全角和半角 |
答題得分者是:Vicen
|
ralph921
一般會員 發表:17 回覆:31 積分:14 註冊:2005-08-22 發送簡訊給我 |
小弟想要對幾個字串進行全形或半形的檢查,例如,某個字串中只能含有全角字,而某些字串中只能有半角的英文字母或者數字(不允許有標點符號),應該通過設置怎樣的條件來判斷? 小弟查找了站内的一些文章,但還是未能全懂。 請達人幫忙解釋以下幾個問題:
1.能否具體解釋下IsDBCSLeadByte() 這個函數的用法,有簡單的實例演示最好;
2.a := Ord(b) 中,a和b分別應是什麽類型的變量?爲何我在使用過程中,b只接受int型,否則就報錯? 小弟初學,問了什麽蠢問題的話還請包涵。謝謝! ==========
普通人。
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
1、IsDBCSLeadByte()是一個字符處理API函數,原型如下:
BOOL IsDBCSLeadByte( BYTE TestChar // character to test );用於判斷給定的字符是否是前導字節,即字符的第一個字節是否是屬於雙字節字符集(DBCS-Double-byte character set)。 參數 TestChar 為待測試的字符,為Byte類型(即0..255整形), 返回結果為布爾型。 如: procedure TForm1.Button2Click(Sender: TObject); var s: string; begin s := ','; ShowMessage(BoolToStr(IsDBCSLeadByte(byte(s[1])), True)); //True s := ','; ShowMessage(BoolToStr(IsDBCSLeadByte(byte(s[1])), True)); //False s := '黄'; ShowMessage(BoolToStr(IsDBCSLeadByte(byte(s[1])), True)); //True end;2、Ord函數用於返回有序類型表達式的序列值, 在 a := Ord(b) 中,b为有序表达式, a为序列值(即排序号,整数) 例如 ord('a') 的返回值是97,即字符'a'在ASCII码表中的序号。 又如: procedure TForm1.Button1Click(Sender: TObject); type ote = (red, blue, yellow); var b:integer; a: ote; begin a := blue; b := ord(a); //b在这里就等于1, 因为blue在ote中排第1个(从0算起) edit1.Text := inttostr(b); end;---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 --------------------------- 發表人 - h@visli 於 2005/10/19 14:10:44
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
其实地球人都知道全角、汉字都是双字节的,所以也没什么考虑,写了这个函数,虽然可能不是最好的方法,但还是比较简单准确的。 用 IsDBCSLeadByte 当然也可以,你用IsDBCSLeadByte在站上搜索一下,N多此类的文章的。 这是写的函数,你可以参考一下:
function TForm1.CheckSBCCaseOrDBCcase(sSou :String):Boolean; Var i : Integer; begin Result := False; for i := 1 to Length(sSou) do begin if MidStr(sSou, i ,1)<>MidBStr(sSou, i, 1) then begin Result := True; Break; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin if CheckSBCCaseOrDBCcase(Memo1.Text) then Showmessage('有全角') else Showmessage('无全角'); end; |
ralph921
一般會員 發表:17 回覆:31 積分:14 註冊:2005-08-22 發送簡訊給我 |
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
用Copy可能不是很方便,事实上MidStr和MidBStr都是用的COPY,但MidStr使用的是WideString型,而MidBStr使用的是AnsiString型。 给你这么一提醒,我又写了个使用COPY这种思路的函数,可以一样做到效果。
function CheckSBCCaseOrDBCcase(sSou :String):Boolean; Var asSou : AnsiString; wsSou : WideString; begin asSou := sSou; wsSou := sSou; Result := Length(asSou)<>Length(wsSou); end; procedure TForm1.Button1Click(Sender: TObject); begin if CheckSBCCaseOrDBCcase(Memo1.Text) then Showmessage('全角') else Showmessage('半角'); end;其实我喜欢用我比较熟悉的方式来做到需要的功能,因为出了问题很容易修正。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |