不知道要怎麼改這個函數,取得沒有亂碼的中文字串 |
答題得分者是:P.D.
|
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
各位前輩及版主大人:
不知道要怎麼改這個函數,取得沒有亂碼的中文字串! 懇請給予提示! 感謝! 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 發送簡訊給我 |
如果只想取出中文字,可以用ByteType這個function去檢查這個byte是不是為一個中文字的第一個byte
因為中文是兩個字,所以你不能只Copy一個char, 在檢查到ByteType為MBCS的第一個byte之後就一次copy兩個byte 詳情請參考Help中的Bytetype跟MBCS routines
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
max5020
資深會員 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
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 發送簡訊給我 |
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;
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」 程式寫的越久,卻發現自己越來越不會寫程式! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |