如何分行显示一个长的字串,该字串中包含单字节和双字节,如何使分出来的行不会出现乱码?也即是如何防止切到汉字的一半?谢谢

解决方案 »

  1.   


    function SplitString(aText: string; aLength: Integer): string;
    function IsValidChar(aChar: Char): Boolean;{
       函数功能:将aText字符串按aLength长度进行分解,并折行显示。
       算法介绍:如果aText字符串长度小于aLength,则返回整个字符串;
                 由于字符串中可能存在汉字,如果分解过程中末位正好遇到汉字
                 的第一个字节,截取结果可能出错,那么我们可以对每次截取
                 的最后一个字节进行判断,如果不属于英文字符、数字,那此
                 字节肯定和后一个字节组成一个汉字,必须在一起才能正确显示。
                 在此,设置一个offSet偏移量,每次遇到特殊情况,偏移量加一即可   备注:函数返回最后结果会多出回车换行符
    }
    function TForm1.SplitString(aText: string; aLength: Integer): string;
    var
      i, j, offSet: Integer;begin
      offSet := 0;
      if Length(aText) < aLength then
        Result := aText
      else
        for i := 0 to (Length(aText) div aLength) do             //总共分几段
        begin
          for j := 1 to aLength do                               //将字符串按长度aLength逐个分解
          begin
            Result := Result + aText[i * aLength + j + offSet];
            if j = aLength then
              if not IsValidChar(aText[i * aLength + aLength]) then
              begin
                Result := Result + aText[i * aLength + aLength + offSet + 1];
                Inc(offSet);
              end;
          end;
          Result := Result + #13#10;
        end;
    end; function TForm1.IsValidChar(aChar: Char): Boolean;
    begin
      if aChar in ['a'..'z', 'A'..'Z', '0'..'9'] then
        Result := True
      else
        Result := False;
    end;
      

  2.   

    查一下ByteType系统函数function ByteType(const S: string; Index: Integer): TMbcsByteType; 
    功能 
    返回字符串S位置Index上的字符在MBCS中类型
    说明 
    多字节字符系统:Multi-Byte Character System (MBCS)
      

  3.   


    Delphi7上通过,但是Delphi2010貌似汉字也存储在一个字节中的,所以在2010中处理就更方便了(本人没使用过2010,说得不对的请见谅)
      

  4.   

    显示?
    放一个tlabel,设为自动折行,调整它的宽度为需要的
    把长文本赋给它的caption
      

  5.   

    用TBytes,再进行转换
     Encoding := nil;
        Size := TEncoding.GetBufferEncoding(Buffer, Encoding);
        s := Encoding.GetString(Buffer, Size, Length(Buffer) - Size);
      

  6.   

    function TForm1.IsValidChar(aChar: Char): Boolean;
    begin
      if aChar in ['a'..'z', 'A'..'Z', '0'..'9'] then
        Result := True
      else
        Result := False;
    end;汉字外的字符不仅仅包括这些,特殊符号也算,所以我觉得这种方式应该不够严谨
      

  7.   

    以往我做的是根据汉字占两个字节,其第一个字节>0xa0来判断的,但是似乎也不严谨。六楼的方法没试过,可以试试看。