一个字符串,有半角的英文字符,也有全角的汉字字符,如何针对每个字符(每个英文字符或汉字)进行区分,对它进行操作。比如一个字符串:'I_want_to_测试一下!!',我想单个字符一个一个地输出,即:先输出 I ,然后 _ ,然后 w,a,n.....,测,试,一,下,!,!。试了一下不行,找不出原因,请大家指教一下。这里先谢谢了!!源程序如下:unit T;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils;type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  str: String;
  i: integer;
begin
  str := 'I_want_to_测试一下!!';
  Memo1.Lines.Add(str);
  for i := 1 to length(str) do
    Memo1.Lines.Add(leftstr(str,i));
end;end.

解决方案 »

  1.   

    var
      str: WideString;
      i: integer;
    begin
      str := 'I_want_to_测试一下!!';
      Memo1.Lines.Add(str);
      for i := 1 to length(str) do
        Memo1.Lines.Add(str[i]);
    end;这样即可。
      

  2.   

    xxmmmx(踢踏) :
      我来的时候你还没答,我研究了半天了,测试好久了,结果是出来了,但很复杂。没想到这么简单。顺便问一下,如果我要把里边的中文全找出来该怎么做。  我的方法可以实现,但不一定完全对,有没有好的办法啊!
    我的方法是:
      procedure TForm1.Button1Click(Sender: TObject);
    var
      str: String;
      i,t: integer;begin
      str := 'I_want_to_测试一下!!';
      Memo1.Lines.Add(str);
      showmessage(chr(32));
      i:=1;
      while i<=length(str) do
        begin
        if (ord(str[i])>32) and (ord(str[i])<129) then
         begin      i:=i+1;
         end else
          begin
           Memo1.Lines.Add(str[i]+str[I+1]);
          i:=i+2;
          end;
        end
    end;
      

  3.   

    var
      vS : WideString;
      I : Integer;
    begin
      vS := 'I_want_to_测试一下!!';  for I:=1 to length(vS) do ShowMessage(vS[I]);
    end;
      

  4.   

    这里面有一个常识,WideString类型中,汉字是作为一个字识别的,而在String类型中,是两个字节组成一个汉字的。var
      str: WideString;
      temp: String;
      i: integer;
    begin
      str := 'I_want_to_测试一下!!';
      Memo1.Lines.Add(str);
      for i := 1 to length(str) do
      begin
        temp:=str[i];
        if length(temp)=2 then
          Memo1.Lines.Add(str[i]);
      end;
    end;
      

  5.   

    xxmmmx(踢踏) 的方法是最简洁的!我也是后来自己看delphi自带的StrUtils文件才发现用WideString就可以实现了。那这就说明delphi中的length(还有StrLen())是不是兼容性差了一点?它不能区分单、双字节的字符!而其他的像我程序中用到的LeftStr()函数就可以自动区分出来,因为在StrUtils单元中LeftStr函数对String和WideString进行了区分,如下:function LeftStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
    begin
      Result := Copy(WideString(AText), 1, ACount);
    end;function LeftStr(const AText: WideString; const ACount: Integer): WideString; overload;
    begin
      Result := Copy(AText, 1, ACount);
    end;