//{分割中文字符串 用于QuickReport中的QRLabel QRDbText 等}
function seprataeStr(str: string;
ii: integer): string;
{分割中文字符串}
var
CutLengthOfLine{ 被处理字符串的总长度 }, j: integer;
sLine{ 被处理的源字符串 }: string;
sCuted{ 按固定长度分割出来的部分字符串 }: string;
iCutLength{ 按固定长度分割出来的部分字符串的长度 }: integer;
bIsDBCS{ 是否是汉字的前半字节 }: boolean;
s:string;
begin
CutLengthOfLine := ii;
if CutLengthOfLine <
2 then
Exit;
sLine := str;
if Length(sLine) = 0 then
s := s+#13+#10
else
repeat //开始处理字符串
iCutLength := CutLengthOfLine;
sCuted := Copy(sLine, 1, iCutLength);//从头取出 iCutLength 长的字符串
bIsDBCS := False;
//先假设没有半个字符串
for j := 1 to iCutLengthdo
//从头到尾逐个检查,至于为什么?
begin
if bIsDBCS then
//如果上一个字节是汉字的前半部分
bIsDBCS := False //则此时本字节是汉字的后半部分,
//所以将是否前半个汉字检测标志设为假
else
if Windows.IsDBCSLeadByte(byte(sCuted[j])) then
bIsDBCS := True;
//否则检查本字节,并根据结果设置标志
end;
//end of for
if bIsDBCS then
Dec(iCutLength);
//如果最后一个字节是汉字的前半部分, 则少截取一个字符,避免乱码
s := s + Copy(sLine, 1, iCutLength) + #13 + #10;
sLine := Copy(sLine, iCutLength + 1, Length(sLine) - iCutLength);
//拷贝出下一部分固定长度的字符串,循环处理
until Length(sLine) <= 0;
Result := s;
end;