全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2274
推到 Plurk!
推到 Facebook!

如何檢查全角和半角

答題得分者是:Vicen
ralph921
一般會員


發表:17
回覆:31
積分:14
註冊:2005-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-19 10:56:26 IP:59.44.xxx.xxx 未訂閱
小弟想要對幾個字串進行全形或半形的檢查,例如,某個字串中只能含有全角字,而某些字串中只能有半角的英文字母或者數字(不允許有標點符號),應該通過設置怎樣的條件來判斷? 小弟查找了站内的一些文章,但還是未能全懂。 請達人幫忙解釋以下幾個問題: 1.能否具體解釋下IsDBCSLeadByte() 這個函數的用法,有簡單的實例演示最好; 2.a := Ord(b) 中,a和b分別應是什麽類型的變量?爲何我在使用過程中,b只接受int型,否則就報錯? 小弟初學,問了什麽蠢問題的話還請包涵。謝謝! ========== 普通人。
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-19 14:05:28 IP:222.248.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-19 14:19:42 IP:221.226.xxx.xxx 未訂閱
其实地球人都知道全角、汉字都是双字节的,所以也没什么考虑,写了这个函数,虽然可能不是最好的方法,但还是比较简单准确的。    用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-19 16:38:23 IP:59.44.xxx.xxx 未訂閱
首先謝謝h@visli大大和Vicen大大的熱心回答。 小弟還有不明白的地方: to h@visli大大:看大大的例子,Byte()應該是一個轉換函數,那麽,它的變量又是什麽呢?所有的類型都可以被Byte()轉化為Byte型嗎? 另外,ord()既可以表示一個半角字符的ASCII碼值,又可以表示某個特定的順序? to Vicen大大:我也考慮過用MidStr的辦法區分,但不是用MidBStr而是用Copy,不知道可以不可以呢? ========== 普通人。
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-19 17:50:43 IP:221.226.xxx.xxx 未訂閱
用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;
其实我喜欢用我比较熟悉的方式来做到需要的功能,因为出了问题很容易修正。
系統時間:2024-05-17 13:31:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!