本人在编写一个类似翻译软件的过程中发现这样一个难题,请各位帮忙:思路是这样的,在一个句子中,可能包含有已知数据库中包含的字符串(也就是单词),但也可能不包含。现在需要把句子中所包含的这些词语全部挑选出来并依据数据库翻译为外语(英语或者是法语等)。为了找到这样的词语,只能逐个查找(因为词语的长度也是不一定的)。考虑到还有可能是从英语翻译到汉语或者是其它语言,在每次查找的时候是逐个字节查找的。比如: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语句就无法执行了。不要建议我采用每次推进两个字节长度,因为你要考虑到汉语中可能还有英语,尤其是奇数个英语的话就更乱套了。拜托各位了,谢谢!
begin
str:=trim(copy(TargetTxt,1,i));
TransStr:=LookUp(Str,FindIt);
if not findit then continue
else then
//用TransStr替换Str
end;上面的代码存在一个问题,因为每个汉字是占两个字符的位置,所以当I为偶数的时候就出现问题,也就是我们无法识别的部分。这本来是意料之中的事情。但问题就在于,半个字符为什么总是一个问号?而且要和字符串的标志组成一个问号,这样我的SQL语句就无法执行了。不要建议我采用每次推进两个字节长度,因为你要考虑到汉语中可能还有英语,尤其是奇数个英语的话就更乱套了。拜托各位了,谢谢!
mbTrailByte: 汉字的第二个字节
mbSingleByte: 单个的字符,不是中文字符。如果Copy出来的是汉字的第一个字节,就再多Copy一个,凑成完整的汉字。
如果是这样的话,到是可以去查询一些汉字编码的相关资料。
在网上查一下,区位码与机内码的资料,问题就清楚了。
西文字符的ASCII码是小于7Fh的,而一个中文是由两个字符组成,每一个都大于
A0h。具体的记不清楚了,不过网上这方面的东西很多,楼主上去搜搜看,很容易找到。
网上有各种语言写的开源小程序下载。
var t:WideString; i:integer;
begin
t:='abc汉字123';
for i:=1 to length(t) do
memo1.Lines.Add(t[i])
end;
『 http://www.coderpub.com 』
----------------
如
//找出字符串里汉字的个数
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;
/////////////////////////////
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基础上的
不过好用。
即可转换你的问题