字符串处理的小问题(50分)

  • 主题发起人 主题发起人 sleepy
  • 开始时间 开始时间
S

sleepy

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有一个很长的字符串 (300个英文字母长,其中包含汉字和字母、数
字等),我想以每个子串18个英文字母的宽度来把它们加入到StringList
中,要求不把汉字分割成两半而产生乱码,请问我该怎么办?
 
用widestring
 
呵呵,我用WideString,搞了半天没弄好,所以才来问的 :(
 
如果第18个正好是汉字怎么办?
 
var
S:WideString;
L:Integer;
begin
S:=OldString;
L:=Length(S);
for i:=1 to 1+L div 18do
StringList.Add(Copy(S,(i-1)*18+1, i*18);
end;
 
如果正好是汉字,我就让它到下一行去 ,或者保留在这一行也行.
也就是说, 每行可以有 18,19字符宽,或者18,17字符宽.
 
用WideString,字符和汉字均是2个字节,Length(WideString)为字符或汉字的个数,而非字节数。不用考虑会把汉字分开。
 
你可以用一个变量来统计显示宽度。
var
S:WideString;
W,Last:Integer;
begin
S:=OldString;
W:=0;
Last:=1;
for i:=1 to Length(S)do
begin
if S <'啊' then
Inc(W) else
Inc(W,2);
if (W=18) or (W=19) or (i=Length(S)) then

begin
StringList.Add(Copy(S,Last, i);
Last:=i+1;
W:=0;
end;
end;

for i:=1 to 1+L div 18do
StringList.Add(Copy(S,(i-1)*18+1, i*18);
end
 
>> S &amp;lt;'啊'
呵呵,这个方法挺巧妙.
 
最后一行for不要。
 
:)
StringList.Add(Copy(S,Last, i);
~~~ i-Last? 呵呵.
谢谢啦 :)
 
接受答案了.
 
我有一个办法:
放一个memo,wordwrap:=false;
把你的字符串放到memo的第一行里,然后对它
repeat
发18次PostMessage(memo1.Handle, WM_KEYDOWN, VK_right, 0);
在发一次PostMessage(memo1.Handle, WM_KEYDOWN, VK_return, 0);
until .....
因为memo会自动区分字母与汉字的。
 
后退
顶部