本人在编写一个类似翻译软件的过程中发现这样一个难题,请各位帮忙:思路是这样的,在一个句子中,可能包含有已知数据库中包含的字符串(也就是单词),但也可能不包含。现在需要把句子中所包含的这些词语全部挑选出来并依据数据库翻译为外语(英语或者是法语等)。为了找到这样的词语,只能逐个查找(因为词语的长度也是不一定的)。考虑到还有可能是从英语翻译到汉语或者是其它语言,在每次查找的时候是逐个字节查找的。比如:for i:=1 to 20 do
begin
  str:=trim(copy(TargetTxt,1,i));
  TransStr:=LookUp(Str,FindIt);
  if not findit then continue
  else then
    //用TransStr替换Str
end;上面的代码存在一个问题,因为每个汉字是占两个字符的位置,所以当I为偶数的时候就出现问题,也就是我们无法识别的部分。这本来是意料之中的事情。但问题就在于,半个字符为什么总是一个问号?而且要和字符串的标志组成一个问号,这样我的SQL语句就无法执行了。不要建议我采用每次推进两个字节长度,因为你要考虑到汉语中可能还有英语,尤其是奇数个英语的话就更乱套了。拜托各位了,谢谢!  
  
  

解决方案 »

  1.   

    用ByteType函数判断一下该字节,返回值如下:mbLeadByte: 汉字的第一个字节
    mbTrailByte: 汉字的第二个字节
    mbSingleByte: 单个的字符,不是中文字符。如果Copy出来的是汉字的第一个字节,就再多Copy一个,凑成完整的汉字。
      

  2.   

    不知道楼主是不是在问,如何分辩一个汉字与两个西文字符的问题。
    如果是这样的话,到是可以去查询一些汉字编码的相关资料。
    在网上查一下,区位码与机内码的资料,问题就清楚了。
    西文字符的ASCII码是小于7Fh的,而一个中文是由两个字符组成,每一个都大于
    A0h。具体的记不清楚了,不过网上这方面的东西很多,楼主上去搜搜看,很容易找到。
    网上有各种语言写的开源小程序下载。
      

  3.   

    有一个东西叫WideString,不知道是不是你想要的procedure TForm1.Button1Click(Sender: TObject);
    var t:WideString;  i:integer;
    begin
        t:='abc汉字123';
        for i:=1 to length(t) do
        memo1.Lines.Add(t[i])
    end;
      

  4.   

    判断是不是汉字,if ord(t[i])>127 then
      

  5.   

    ccrun(老妖)(www.ccrun.com)的方法很不错~!
      

  6.   

    用widestring就行了----------------
    『  http://www.coderpub.com  』
    ----------------
      

  7.   

    同意,widestring就可以

    //找出字符串里汉字的个数
    function HowManyChineseChar(Const s:String):Integer;
    var
       SW:WideString;
       C:String;
       i, WCount:Integer;
    begin
       SW:=s;
       WCount:=0;
       For i:=1 to Length(SW) do
       begin
          c:=SW[i];
          if Length(c)>1 then
             Inc(WCount);
       end;
       Result:=WCount;
    end;
      

  8.   

    是啊是啊,学到了
    /////////////////////////////
    var
    si:string;
    s:string;
    i:integer;
    begin
     si:='wer四ldjfl华sdjfi说23434';
     for i:=0 to length(si) do
     begin
     if bytetype(si,i)=mbleadbyte then s:=s+copy(si,i,2);
     end;
     showmessage(s);
    end;
    //////////////////////////////
    function ByteType(const S: string; Index: Integer): TMbcsByteType;
    begin
      Result := mbSingleByte;
      if SysLocale.FarEast then
        Result := ByteTypeTest(PChar(S), Index-1);
    end;
    ////////////////////////////
    好像也是建立在widestring基础上的
    不过好用。
      

  9.   

    AnsiStrLastChar()
    即可转换你的问题
      

  10.   

    这两天网络坏了,很抱歉现在才来结帐。不过我已经解决了这个问题了。用的是WideString.具体的原理就是,如果把原来的String转换为WideString类型,这样,无论是中文还是西文,都占位两个字节,这样处理起来就会和处理单纯的英文字符一样简单了。非常感谢楼上各位兄弟的回答,深表谢意,你们提供的方法我将逐个尝试。