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

不知道要怎麼改這個函數,取得沒有亂碼的中文字串

答題得分者是:P.D.
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-09 10:29:01 IP:220.134.xxx.xxx 訂閱
各位前輩及版主大人:
不知道要怎麼改這個函數,取得沒有亂碼的中文字串! 懇請給予提示!
感謝!
function GetChineseWordPart(S: string): string;
// ShowMessage(GetChineseWordPart('A我abcB是C一123個a程b式c')); // ABC123abc
var
NewStr: string;
i: Integer;
// nChar: array of Byte;
begin
// FillChar(nChar, SizeOf(nChar), 0);
// SetLength(nChar, Length(NStr));
// Move(NStr[1], nChar[0], Length(NStr));
NewStr := '';
for i := 1 to Length(Trim(S)) do
begin
if not (Ord(S[i]) in [32..127]) then
begin
NewStr := NewStr S[i];
end;
end;
Result := NewStr;
end;
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-09 14:43:00 IP:220.228.xxx.xxx 未訂閱
如果只想取出中文字,可以用ByteType這個function去檢查這個byte是不是為一個中文字的第一個byte
因為中文是兩個字,所以你不能只Copy一個char,
在檢查到ByteType為MBCS的第一個byte之後就一次copy兩個byte
詳情請參考Help中的Bytetype跟MBCS routines
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-13 13:47:58 IP:59.120.xxx.xxx 未訂閱
function GetChineseWordPart(S: string): string;
// ShowMessage(GetChineseWordPart('A我abcB是C一123個a程b式c')); // ABC123abc
var
NewStr: string;
i: Integer;
// nChar: array of Byte;
begin
// FillChar(nChar, SizeOf(nChar), 0);
// SetLength(nChar, Length(NStr));
// Move(NStr[1], nChar[0], Length(NStr));
NewStr := '';
i:= 1;
while i<=Length(trim(s) do
begin
if Ord(s[i])>127 then i:= i 2
else
begin
NewStr:= NewStr s[i];
i:= i 1;
end;
Result:= NewStr;
end;

g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-14 03:58:42 IP:220.134.xxx.xxx 訂閱
前輩:
對不起喔! 我要取的部份是中文的部份,不是英文
ShowMessage(GetChineseWordPart('A我abcB是C一123個a程b式c')); // 我是一個程式

不知道您的是否可以再次提供見解! 謝啦!
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-14 09:46:47 IP:61.67.xxx.xxx 未訂閱
function WordsWrap(instr: string; cutlength: integer): string;
var sCuted: string;
temp: string;
iCutLength: integer;
j: integer;
bIsDBCS: boolean;
begin
temp:= '';
// 截出 _LengthPerLine 個字元出來
iCutLength:= cutlength;
repeat
sCuted:= Copy(instr, 1, iCutLength);
iCutLength:= Length(sCuted);
bIsDBCS:= False;
// 看看最後一個字元是不是中文的前半個字
for j:= 1 to iCutLength do begin
if bIsDBCS then bIsDBCS:= False
else if Windows.IsDBCSLeadByte(byte(sCuted[j])) then bIsDBCS:= True;
end;
// 如果最後一個字是中文的話, 少截一個字元
if bIsDBCS then Dec(iCutLength);
temp:= temp (Copy(instr, 1, iCutLength)) #13;
instr:= Copy(instr, iCutLength 1, Length(instr) - iCutLength);
until Length(instr) <= 0;
result:= temp;
end;

這是一個判斷是否為中文字然後做轉折的函式, 與你要的很類似, 可以參考看看, 重點在Windows.IsDBCSLeadByte(byte(sCuted[j])) , 可以決定是否取出的字元是否為雙字元碼
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-14 10:56:59 IP:220.134.xxx.xxx 訂閱
PD前輩:
感謝您一直在提示和範例!真是感謝您!我附上我改好的函數!
只能說一句:『您真是太強啦!』
function GetChineseWordPart(S: string): string;
// ShowMessage(GetChineseWordPart('A我abcB是C一123個a程b式c')); // 我是一個程式
var
NewStr: string;
i: Integer;
IsChineseWord: Boolean;
begin
NewStr := '';
IsChineseWord := False;
for i := 1 to Length(Trim(S)) do
begin
if Windows.IsDBCSLeadByte(byte(S[i])) then // 判斷是否為 DBCS雙位元組字元集(Double Byte Character Set)
begin
if IsChineseWord = False then
begin
NewStr := NewStr S[i] S[i 1]; // 因為是中文字(DBCS)一次吃 2 BYTES
IsChineseWord := True;
end
else
begin
IsChineseWord := False;
end;
end
else
begin
IsChineseWord := False;
end;
end;
Result := NewStr;
end;


------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
系統時間:2024-05-16 14:25:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!