如何判断一个字符是单字节字符还是汉字中的第1个或第2个字符?(70分)

  • 主题发起人 主题发起人 zgj_gd
  • 开始时间 开始时间
Z

zgj_gd

Unregistered / Unconfirmed
GUEST, unregistred user!
2010024|東莞市中華包装廠|45865197|東莞|123
上述字符串是以‘|’分割的字符串,如何将各个域取出来?即:
s1='2010024'
s2='東莞市中華包装廠'
s3='45865197'
s4='東莞'
s5='123'
我用pos来找'|',然后拆分字符子串。但繁体字‘東’第二个字节刚好也是'|',所以造成拆分错误。该如何判断,当前的字符‘|’是属于汉字还是单字节字符?
该如何分拆上述字符串?
 
汉字的编码是属于双字节的,判断一个字符是否为汉字,首先是判断第一个字节是否大于等于$7F以上,如果是大于等于$7F以上的值,则可以判断这个编码是汉字双字节编码。所以,只需先判断第一个字节,如果第一个字节有大于7F的则第二个字节是属于汉字的,应该以汉字的处理方法处理。否则以单字节处理。
 
要用WideString,宽字符不分中文还是英文,都按一个字符处理。
procedure TForm1.Button1Click(Sender: TObject);
var
s: WideString;
sTmp: string;
begin
sTmp:= '';
s:= '2010024|東莞市中華包装廠|45865197|東莞|123';
s:= s + '|';
while Length(s) <> 0 do
begin
sTmp:= sTmp + s[1];
Delete(s, 1, 1);
if s[1] = '|' then
begin
Memo1.Lines.Add(sTmp);
sTmp:= '';
Delete(s, 1, 1);
end;
end;
end;
 
这样不行呀!如上述简体的‘莞’字它两个字节都是大于7F的。所我找到最后一个'|'后,再判断前一个字节是否大于7F,如果大于7F,则当汉字来处理。但莞’字它两个字节都是大于7F的,这样明显不对了???
 
晕,一般处理字符都是按照先前面到后面顺序判断的,你从后面判断前面的当然是不行的。也就是说,判断双字节应该放到最前面来判断,不能放到先判断'|'再来判断是否为双字节,如。:
for i := 1 to Length(Strings) do
begin
if Strings >= $7F then
begin
// 这里按汉字处理后一个字节
end else
// 这里安单字节处理。
end;
 
多人接受答案了。
 
后退
顶部