線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2626
推到 Plurk!
推到 Facebook!

中文字的截取

尚未結案
sangya
一般會員


發表:21
回覆:46
積分:13
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-21 08:29:19 IP:61.218.xxx.xxx 未訂閱
請教各位 有一個欄位資料長度是25碼,裡面可以輸入數字和中英文,如果太長會被 截掉一部份,但若是中文的話被截一半會形成亂碼,導致讀進的資料會 出問題..是否有辦法來分辦最後一字是數字或中英文,以利截取? 煩請各位指教,謝謝 sangya
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-21 08:44:57 IP:210.65.xxx.xxx 未訂閱
Hi sangya,    關於中文字擷取,你可以參考以下討論    http://delphi.ktop.com.tw/topic.php?topic_id=40745 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40612 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-21 09:01:18 IP:61.222.xxx.xxx 未訂閱
如果你只是為了要解決在截掉過長的字串,會發生拆到一個中文字的情況的話,可以運用wideString的型態來處理.在wideString裡,一個字就是一個字,不管是中文字或英文.範例如下,您試試:
var
  ws:WideString;
  s:String;
begin
  s:=Copy(Edit1.Text,1,25); //25表示你的欄位最長為25碼
  ws:=s; //轉成WideString
  Edit2.Text:=Copy(ws,1,Length(ws)); //再截一次即可
end;
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-21 09:35:37 IP:218.168.xxx.xxx 未訂閱
用Windows API IsDBCSLeadByte可用來判定某Char是否為雙Byte字元(即中文字) 的前導Byte
function TruncateChinese(str:string):string;
begin
  result := str;
  if (length(str) >= 25) and(IsDBCSLeadByte(Byte(str[25]))) then 
   result  := Coyp(str,1,24)
  else result  := Coyp(str,1,25);
end;
 
混心雜欲 棄修身~唉 發表人 - speedup 於 2004/07/21 09:37:18
------
唉~
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-22 09:22:09 IP:218.5.xxx.xxx 未訂閱
我常需处理这个问题,因此我做了一个函数fStrCopy代替DELPHI的Copy,具体做法是:判断每个字符,并统计英文,数字的字符个数及中文字符的个数,如果在截取范围内中文字符个数为单数就多取一个字符.代码如下: 其中viBeg返回下一次截取的位置,如要求截取10个字符,但实际截取了11个,这viBeg返回12. 虽然是笨方法,但很有效 function fStrCopy(vsStr: string; var viBeg: integer; viLen: integer): string; var i, j: integer; dsTmp: string; daTmp: array[0..1023] of char; begin ZeroMemory(@daTmp, 1023); dsTmp := Copy(vsStr, viBeg, viLen); if Length(dsTmp) = viLen then begin Move(PChar(dsTmp)^, daTmp, viLen); j := 0; for i := 0 to viLen - 1 do begin if (daTmp[i] < #32) or (daTmp[i] > #126) then begin j := j 1; end; end; if (j mod 2) = 1 then begin //因发票打印空间较小,为防止超出表格统一少取一个字符 dsTmp := Copy(vsStr, viBeg, viLen - 1); viBeg := viBeg viLen - 1; end else begin viBeg := viBeg viLen; end; end else begin viBeg := viBeg Length(dsTmp); end; fStrCopy := dsTmp; end;
sangya
一般會員


發表:21
回覆:46
積分:13
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-02 09:24:27 IP:61.218.xxx.xxx 未訂閱
感謝各位的大力幫助,謝謝!!!
系統時間:2024-06-28 19:22:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!