一段string,中间有中文、英文、数字等,要求每隔10个字(如遇英文则一个字母算一个,数字同)插入一个回车换行,如何保证不插入到一个汉字的中间(20分)

  • 主题发起人 主题发起人 care4me
  • 开始时间 开始时间
C

care4me

Unregistered / Unconfirmed
GUEST, unregistred user!
一段string,中间有中文、英文、数字等,要求每隔10个字(如遇英文则一个字母算
一个,数字同)插入一个回车换行,如何保证不插入到一个汉字的中间
 
汉字值是大于127的。
 
没那么简单吧,一个汉字有两个字节,它的值都大于127,
怎么判断是前一个字节还是后一个?
 
搞得太复杂了吧
用length判断好了
length(string)=9
如果在增加一个字符
length(strig)=11,
就说明是汉字了
 
错了
对不起
 
计算你>127的字符个数是偶数可插入否则提前一个字符插
 
to::初学者1
可能会增加半个汉字吧
10个字符中,大于127的有偶数个,正好。
奇数个,那不就是汉字被分开了么。第10个肯定为半个汉字
 
这个可能有用(改编自forss给我的程序)
var
tmp_in: pchar;
i: integer;
source:string;
begin
source:='asd啊';
tmp_in := pchar(copy(source, length(source), 1));
for i:=48 to 57 do
if chr(i)=tem_in then
begin
//数字
exit;
end;
for i := 65 to 90 do
if chr(i) = tmp_in then
begin
//拼音
exit;
end;
for i := 97 to 122 do
if chr(i) = tmp_in then
begin
// 拼音
exit
end;
result...
//汉字
end;
 
楼上几位说的没错。汉字的ASCII码大于127,可设标志,读每一个字符,大于127标志加TRUE,当标志为TRUE时,若读到的字符大于127,就是一个汉字,否则置标志为FALSE,继续。
 
可以判断读到的最后一个字符的ASCII码是否大于128即可
 
为你写了这样一个function,你试一下:
function InsertEnterKey(OldStr:String):String;
type CharBit = ^char;
var
StrBit : CharBit
BitChar : char;
TmpStr,ReturnStr:string;
icount,iTen:integer;
begin
Result := OldStr;
TmpStr := '';
ReturnStr := '';
iTen := 0
iCount := 1
while iCount <= length(OldStr) do begin
if length(OldStr)-iCount + iTen <= 10 then begin
ReturnStr := ReturnStr + copy(OldStr,iCount,254);
break;
end;
if iTen = 10 then begin
iTen := 0
ReturnStr := ReturnStr + #13+#10;
end;
inc(iTen,1);
TmpStr := copy(OldStr,iCount,1);
StrBit := CharBit(TmpStr);
BitChar := StrBit^;
if ord(BitChar) > 127 then begin
ReturnStr := ReturnStr + copy(OldStr,iCount,2)
//加一个汉字
inc(iCount,2);
end else begin
ReturnStr := ReturnStr + copy(OldStr,iCount,1)
//加一个非汉字字符
inc(iCount,1);
end;
end;
Result := ReturnStr
end;
 
用CharLength函数
 
上面人说的都是笨方法,还是我来告诉你,用ByteType函数
intTmp:=Length(strTmp);
if ByteType(strTmp,intPos)=mbLeadByte then
Result:=Copy(strTmp,1,intPos-1)+#10#13+Copy(strTmp,intPos,intTmp-intPos+1)
else
Result:=Copy(strTmp,1,intPos)+#10#13+Copy(strTmp,intPos+1,intTmp-intPos);
我这里只是给你插入一个回车换行符,具体则采用循环语句
 
这是偶以前写的数汉字的程序。[:D]
function TForm1.Number(FileName:string):Longint;
var //IOR,
I:Longint;
F:TextFile;
St,Line:String;
Character:Longint;
begin
Result:=-1;
try
//Repeat
AssignFile(F,FileName);
Reset(F);
// IOR:=IOResult;
//Until IOR=0;

Character:=0;
While Not Eof(F) do
begin
Readln(F,Line);
I:=0;
Repeat
inc(i);
if (Ord(Line)>=176) and (Ord(Line[i+1])>=160) then
Begin
inc(Character);
Inc(I);
end
Else If (ord(Line)>=160) and (ord(line[i+1])>=160) then inc(I);
Until I>=length(Line);
end;
CloseFile(F);
Except end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(inttostr(Number('d:/1.txt')));
end;
 
把string转化成widestring,如果某个元素大于1,则代表亚洲字符。
var sw:widestring;
c:string;
i,wcount:integer;
begin
sw:=s;// 要处理的字符串
for i:=1 to length(sw) do
begin
c:=sw;
if length(c)>1 then //汉字
end;
那你也可以用 widestring, 直接在第10个字符处加了
 
我用VC做过类似的东西,你要先知道原则,
汉字GB和GBK码:双字节,前一个大于128。
英文或数字:单字节,小于128。

procedure TForm1.Button1Click(Sender: TObject);
var
i, Count: Integer;
Str, SubStr: String;
begin
Str := Edit1.Text;
i := 1;
Count := 0;
while i <= Length(Str) do
begin
if Str > #128 then
begin
SubStr := SubStr+Str+Str[i+1];
i := i+1;
end
else
SubStr := SubStr+ Str;

i := i+1;

Count := Count + 1;
if (Count = 10) or (i > Length(Str)) then
begin
ShowMessage(SubStr);
Count := 0;
SubStr := '';
end;
end;
end;

 
上面人说的都是笨方法,还是我来告诉你,用ByteType函数
intTmp:=Length(strTmp)
//strTmp待分割的字符
if ByteType(strTmp,intPos)=mbLeadByte then //intPos待分割的位置
Result:=Copy(strTmp,1,intPos-1)+#10#13+Copy(strTmp,intPos,intTmp-intPos+1)
else
Result:=Copy(strTmp,1,intPos)+#10#13+Copy(strTmp,intPos+1,intTmp-intPos);
我这里只是给你插入一个回车换行符,具体则实现采用循环语句

 
用WideString类型的字符串,它是UNICODE的,对东方字符的支持非常好,
不用担心半个字的情况
 
procedure TForm1.Button1Click(Sender: TObject);
var str,str1:string;
I:INTEGER;
ishead:boolean;
begin
str:='a1a7中d1d文a1';//这个是你的字符串
ishead:=true;
str1:='';
FOR i:=1 to length(str) do
begin
if str>chr(127) then
begin
if not ishead then
begin
ishead:=true;
//showmessage('汉字尾');
str1:=str1+str+#13#10;
end
else
begin
ishead:=false;
str1:=str1+str;
//showmessage('汉字头');
end;
end
else
begin
str1:=str1+str+#13+#10;
end;
end;
memo1.Text:=str1;//MEMO1里的内容是最后的结果
end;
 
后退
顶部