我的程序是直接从硬盘读文件或者从POP3下载文件,
然后进行格式化处理,我不知道你说的软回车是什
么,反正我没有处理过。不过,我想你可以把软回
车替换成硬回车再处理。或者,修改一下我下面的
函数,把遇到硬回车设成一定分段,遇到软回车判
断是否分段。下面是我的两个函数:
这个函数用来判断是否要合并两行:
function SameParagraph(const FirstLine:string;const SecondLine:string):boolean;
var
LastCharOfFirstLine:string; //第一行的最后字符
FirstCharOfSecondLine:string;//第二行的起始字符
Begin
//gParameter.boolSpliteByReturn表示空行是否作为分段标记
if((0 = Length(FirstLine)) or (0 = Length(SecondLine))) then
Begin
if(not gParameter.boolSpliteByReturn)
then result := true
else result := false;
exit;
end;
//gParameter.boolSpliteByChar表示特定字符是否作为分段标记
if(not gParameter.boolSpliteByChar) then
begin
result := true;
exit;
end;
if(integer(FirstLine[Length(FirstLine)]) >= $80) then //中文字符
LastCharOfFirstLine := Copy(FirstLine,Length(FirstLine) - 1,2)
else//英文字符
LastCharOfFirstLine := FirstLine[Length(FirstLine)];
if(integer(SecondLine[1]) >= $80) then
FirstCharOfSecondLine := Copy(SecondLine,1,2)
else
FirstCharOfSecondLine := SecondLine[1];
//gParameter.strEndChar表示作为分段标记的字符(string类)
//我的设定 = '。?!…」”)'
//gParameter.strNotFirstChar表示不能作为一段起始的字符(string类)
//我的设定 = '。?!」”)'
if((Pos(LastCharOfFirstLine,gParameter.strEndChar) <> 0) and
(Pos(FirstCharOfSecondLine,gParameter.strNotFirstChar) = 0)) then
begin
result := false;
exit;
end;
result := true;
end;
//这个函数是对一个段落进行格式化成为每行固定长度。
//同时设定了避头尾字符
function FormatLine(const oldLine:string;
const LineLength:integer;
const NotEndLineChar:string;
const NotFirstLineChar:string):string;
var
Line:string;
NewLine,ReturnLine,NextChar:string;
cnumber,number,theLength,i,j:integer;
Begin
line := DeleteTerminalBlank(oldLine);//删除头尾空格
NewLine := StringOfChar(' ',4);
ReturnLine := '';
cnumber := 0;
number := 4;
theLength := Length(line);
j := 1;
while(j <= theLength) do
Begin
if(LineLength <= number) then
Begin
if((j > 1) and (line[j-1] < #$80) and (line[j] < #$80)) then
//这个判断不适合big5码
Begin
//前面一个与现在字符都不是中文字符
if(line[j-1] = ' ') then
Begin
if(line[j] <> ' ') then
Begin
ReturnLine := ReturnLine + NewLine + #13#10;
NewLine := line[j];
number := 1;
cnumber := 0;
Inc(j);
continue;
end
else
begin
Inc(j);
continue;
end;
end
else
Begin
//前面一个字符是英文,现在的字符也是英文或空格,不分段
NewLine := NewLine + line[j];
cnumber := 0;
Inc(j);
continue;
end;
end
else if(0 = (cnumber mod 2)) then//有个什么函数可以直接判断的来着
Begin
//看现在的符号是否可以作为行尾符号
if(line[j-2] >= #$80) then NextChar := Copy(line,j-2,2)
else NextChar := line[j-1];
if(Pos(NextChar,NotEndLineChar) <> 0) then
Begin
Delete(NewLine,Length(NewLine) - Length(NextChar) + 1,Length(NextChar));
ReturnLine := ReturnLine + NewLine + #13#10;
NewLine := NextChar + line[j];
number := Length(NextChar) + 1;
cnumber := 0;
for i := 1 to Length(NextChar) do
if(NextChar >= #$80) then Inc(cnumber);
if (line[j] >= #$80) then Inc(cnumber);
Inc(j);
continue;
end;
//看后面是不是标点符号
if(j = theLength) then
Begin
NewLine := NewLine + line[j];
Inc(j);
continue;
end
else
Begin
if(line[j] >= #$80) then
NextChar := Copy(line,j,2)
else
NextChar := line[j];
if((Pos(nextChar,NotFirstLineChar) <> 0) or (NextChar = ' ')) then
Begin
//是标点符号,或者是空格,加在新行后面。
NewLine := NewLine + NextChar;
Inc(j,Length(NextChar));
cnumber := 0;
continue;
end;
end;
ReturnLine := ReturnLine + NewLine + #13#10;
NewLine := line[j];
number := 1;
if(line[j] >= #$80) then cnumber := 1;
Inc(j);
continue;
end
else
Begin
//是中文字符的后半个字符
NewLine := NewLine + line[j];
cnumber := 0;
Inc(j);
continue;
end;
end
else//长度大于等于LineLength
Begin
NewLine := NewLine + line[j];
if(line[j] >= #$80) then
Begin
Inc(cnumber);
Inc(number);
end
else
Begin
Inc(number);
cnumber := 0;
if (j < theLength) and (line[j+1] >= #$80) and (1 = number mod 2) then
Begin
//如果下一个是中文,而现在为奇数,则补一个空格
NewLine := NewLine + ' ';
Inc(number);
end;
end;
Inc(j);
continue;
end;
end;
ReturnLine := ReturnLine + NewLine + #13#10;
Result := ReturnLine;
end;