怎么从tmemorystream中一个个字符读出,比如'您好ab',读出来成'您','好','a','b' ( 积分: 100 )

  • 主题发起人 主题发起人 xj307
  • 开始时间 开始时间
中文字符的ascii码都大于128。
如果大于128你就2个一起读。
 
你尝试一下CharNext/CharPrev这两个函数,我不是很确定.
 
汉字的内码大于160,可用ord函数取内码来判断。
s := '你好ab';
if ord(s)> 160 就是汉字,你还要知道是汉字的前半个还是后半个,不要出现乱码。
写过这样的程序,现在具体的想不起来了。
 
能否具体点,我是直接从流读,小弟比较菜,给段具体的代码最好,谢了
 
procedure TForm1.Button3Click(Sender: TObject);
var
a : PChar;
i : integer;
begin
a := '你好ab';
for i := 1 to 4 do
showMessage(AnsiMidStr(a, i, 1));
end;
 
大哥,真的服了你了,我写了段代码并且测试通过,你看看吧
procedure TForm1.Button3Click(Sender: TObject);
var
s,s1: string;
b: Boolean;
i: Integer;
begin
s := Edit1.Text;
s1 := '';
b := False;
for i:=1 to length(s) do
begin
if ord(s) > 128 then
begin
if b then
begin
s1 := s1 + s;
b := False;
ShowMessage(s1);
s1 := '';
end
else
begin
s1 := s;
b := True;
end
end
else
begin
s1 := s;
ShowMessage(s1);
s1 := '';
end;
end;

end;
 
Edit1.Text是输入的任何内容
 
其时楼主的意思就是取出一个进行判断是否是字符或是汉字。
你可以找一下汉字的划分时断字符值的范围就可以了。
 
比较简单的一个方法:
var
i,l:integer;
s1,s2:string;
begin
// 假设ms是你要读的内存流对象
ms.Position:=0;
SetLength(s1,ms.Size);
ms.Read(s1[1],ms.Size);
i:=1;
l:=Length(s1);
s2:='';
While i<=l do
case ByteType(s1,i) of
mbSingleByte:
begin
if i>1 then
s2:=s2+','''+s1+''''
else
s2:=s2+''''+s1+'''';
inc(i)
end;
mbLeadByte:
begin
if i>1 then
s2:=s2+','''+s1+s1[i+1]+''''
else
s2:=s2+''''+s1+s1[i+1]+'''';
inc(i,2)
end
end;
...
 
有如下函数:
boolean windows.IsDBCSLeadByte(BYTE TestChar );
你可以看看最后一个字元是否是一个中文的前半个字.
完全可以解决你的问题
 
The IsDBCSLeadByte function determines whether a character is a lead byte ?that is, the first byte of a character in a double-byte character set (DBCS).

BOOL IsDBCSLeadByte(

BYTE TestChar // character to test
)



Parameters

TestChar

Specifies the character to be tested.



Return Values

If the character is a lead byte, the return value is nonzero.
If the character is not a lead byte, the return value is zero. To get extended error information, call GetLastError.

Remarks

Lead bytes are unique to double-byte character sets. A lead byte introduces a double-byte character. Lead bytes occupy a specific range of byte values. The IsDBCSLeadByte function uses the ANSI code page to check lead-byte ranges.
 
先把流转成字串再处理
 
转成WideString类型,就方便了
 
多人接受答案了。
 
to xj307:
你怎么能给lxw5214他40分呢,他的程序是错误的,你使用时很可能出现乱字符
 
后退
顶部