Wolfgang Chien's Homepage | Delphi¾Ç²ßµ§°O - °Ýµª½g |
½Ð°Ýn§PÂ_³sÄòªº¨âÓ byte¬O§_¬°¤@Ó BIG-5 ¤¤¤å¦r¡A
°Ý¦¹·Q°Ý¬Ý¬Ý¦³¨S¦³²{¦¨ªº API ©Î function ¥i¥H¥Î§r¡H
°²¦p¨S¦³¤¤¤åÀ³¥Î²Õ¥óªºªB¤Í, Win32 ¤¤¦³¤@Ó IsDBCSLeadByte ³oÓ API ¥i¥Î, ¦b Delphi ªº¨Ï¥Î¥Ü¨Ò¦p¤U:
Windows.IsDBCSLeadByte(byte(sTest[1]));
(¤¤¤åÀ³¥Î²Õ¥ó¤¤ªº IsLeadByte ¨ä¹ê¤]¥u¬O©I¥s³oÓ API ¦Ó¤w)
´N³s¬O¤£¬O¤¤¤å¦r³o¼Ë²³æªº°ÝÃD¥i¯à³£¨Ã¤£³æ¯Â³á...., ³oÓ°ÝÃD¤§«e³Q§Ú·Q±o¦³ÂIÆp¤û¨¤¦y¤F.... ¤]³\ìµo°ÝªÌ¼e¹F¥i¥H±N C ªºµ{¦¡É§Ú¬Ý¤@¤U... :p
¥ý¨Ó¬Ý³oÓ¨Ò¤l:
procedure TForm1.Button5Click(Sender: TObject); var sTest: string; begin sTest := '¤¤¤å¦r'; // ¨S¦³À³¥Î²Õ¥óªº½Ð¥Î³oÓ: Windows.IsDBCSLeadByte(byte(sTest[1])); if IsLeadByte(@sTest[1]) then ShowMessage('Yes 1'); if IsLeadByte(@sTest[2]) then ShowMessage('Yes 2 ???'); end;
Yes1 Åã¥Ü¥X¨Ó¬O¹ïªº, ¥i¬O Yes2 ¤]¶]¥X¨Ó, ´N..., ¬Ý¨Ó, ³oÓIsDBCSLeadByte¥i¯à¥u¤ñ¹ï¤F¤@¤U¤º½Xªí´Nµ¹µ²ªG¤F. ©Ò¥H, ¥H¤Uªºµ{¦¡:
procedure TForm1.Button1Click(Sender: TObject); var s: string; i: integer; begin s := '¤¤¤å¦r'; for i := 1 to Length(s) do if Windows.IsDBCSLeadByte(byte(s[i])) then ShowMessage(IntToStr(i) + '*' + IntToStr(Ord(s[i]))); end;
1. 2. 3. 4. 5. ³£¬O Leadbyte, ³s TrailByte ¤]¬O..., «¢«¢!
·íµM, ³o²o¨ì¤¤¤å¦r¬O double-byte, ¬JµM¥u§PÂ_¤@Ó¦ì¸m¤£·Ç, ´N¦³¤H§Q¥Î¨âÓ¦r¤¸«ü¼Ð, °£¤F¥»¨¤§¥~, ÁÙ¤ñ¸û°Ñ¦Ò¥t¤@Ó¦ì¸mªº¦r¤¸, µM«á±o¥X¤@Ó¤ñ¸û·Ç½Tªºµ²ªG. ¦³¿³½ìªºªB¤Í¥i¥H°Ñ¦Ò¤¤¤åÀ³¥Î²Õ¥óªº¥H¤U¨âÓ¨ç¼Æ:
function IsMBSLead( p1, p2: pchar ) : Boolean; function IsMBSTrail( p1, p2: pchar ) : Boolean;
¥¦Ì¥i¯à¤ñ¸û·Ç¤@¨Ç.
¤j®a¥i¯à´¿ª`·N¹L, Windows 95 ªº EditBox ¨ÃµLªk¥H·Æ¹«¹ï¥bÓ¤¤¤å¦r§@¥X¤Ï¥Õ¿ï¾Ü¼Ð°O, ©Ò¥H, §Ú¦Û¥H¬°§ä¨ì¤@ӫܺC¦ý·Ç½Tªº¤èªk, ¥i¬O¥H¤Uªº±¡§Î©O?
procedure TForm1.Button2Click(Sender: TObject); {$h-} var sTest: string; begin sTest := '¤¤¤å¦r'; ShowMessage(Copy(sTest, 2, 2)); with TEdit.Create(Self) do begin Parent := Self; // Text := Copy(sTest, 2, 2); // 1. ¤¤?? bug Text := sTest[2] + sTest[3]; // 2. ¤¤?? bug // ¤£nÃhºÃ, TrailByte + ¥t¤@Ó¦rªº Leadbyte ¥¿¦n¬O '¤¤' // ¤£¬O Copy ¨ç¼Æ¦³°ÝÃD SelStart := 0; SelLength := 2; if SelLength = 0 then ShowMessage('Not Chinese') else ShowMessage('Yes, Chinese word'); Free; end; end;
¨S¿ù°Õ! µ²ªG¬O'¤¤'¦r, §PÂ_'¤¤'¦r¬O¤¤¤å¦r¤]¹ï, ¦ý¬O¦U©î¤@Ó¦rªº«e«á¥X¨Ó²Õ¥X¨Óªºµ²ªG¦A§PÂ_¨ä¤@Ó¦r¤¸¬O¤£¬OLeadbyte, ²ª½¬OGIGO (Garbage In Garbage Out)ªº¨å«¬.
»¡¤F¥b¤Ñ, °ÝÃD³Q§Ú½ÆÂø¤Æ¤F, ²³æªº»¡,
![]() |
1. IsDBCSLeadByte ¤£¬O¤@¥i§¹¥þ¥i¾aªº¨ç¼Æ, ¤¤¤å¬O double-byte, ¥u¥H¤@ӶǤJ¦r¤¸È§@§PÂ_±`±`¤£·Ç. |
![]() |
2. n¥¿½T±N¦UÓ¤¤¤å¦rÂ_¶}ªºµ{¦¡¥i¯à«Ü½ÆÂø. ¥Î¨âÓ pchar ¨Ó§@¤ñ¸û, ·Ç½T©Ê·|´£°ª¤@ÂI. |
¥u¬O´£°ª¤@ÂI¦Ó¤w, ¦³¤¤¤åÀ³¥Î²Õ¥óªºªB¤Í¥i¥H¸Õ¸Õ:
var sOrigin, sTest: string; begin sOrigin := '¤¤¤å¦r'; sTest := Copy(sOrigin, 4, 2); // Åܦ¨ å¦ ³oөǦr if IsMBSLead(@sTest[1], @sTest[1]) then Showmessage('Leadbyte'); end;
¹ïªº, §Ú¤S¬G·N¤Á¶}¤¤¤å, ©Ò¥H¦³¤H·|Á¿, À³¸Ó¬O Copy(..., 3, 2)¤~¬O, ¶â! ¨º§Ú«ç»òª¾¹D¸Ó±qþùض}©l©O?(þùجO¤¤¤å¦r)? ü! §Ú¸£µ¬¤S¤£²M·¡¤F...
¤¤¤åÀ³¥Î²Õ¥ó¦³ AnsiCopy() µø¤¤¤å¦r¬°¤@Ó³æ¦ì, ¨º¥H¤Uªºµ{¦¡©O?
var sTest: string; begin sTest := '¤¤¤å¦r'; ShowMessage(AnsiCopy(sTest, 2, 2)); sTest := #156 + '¤¤¤å¦r'; ShowMessage(AnsiCopy(sTest, 2, 2)); // ??¤¤å¦.. end;
Á¿¤F³o»ò¦h, §Úªº·N¨£¬O: ¦^¨ììÂI, °£«D¦³¤H¬G·N·o³J©ÎªÌ¶Ç¤Jªº¦r¦ê¤w¸g¦³°ÝÃD, ©ÎªÌ¨ºÓ¤º½X®Ú¥»¨S¦³¦r, §_«h¥u¥ÎIsDBCSLeadByte()´N¥i¥H¤F§a.
º¶ | ¾Ç²ßµ§°O | ¥DÃD¤½¶é | ³nÅé¤U¸ü | Ãö©ó¥»¯¸ | °Q½×«H¸s | ¬Û¬ù¤U¦¸ |