身份证信息记录类型如下定义:其中name,address读出来都是简体的汉字。
在繁体xp系统里读出来的姓名和地址都带有乱码:‘?’,用了简体转繁体的函数还是一样某些字显示问号。而在我开发的电脑里面就不会显示乱码。完全可以把简体转换成繁体显示出来。//定义如下
    tagIDCardData = packed record
    Name: array[0..31] of AnsiChar;
    Sex: array[0..3] of AnsiChar;
    Nation: array[0..5] of AnsiChar;         
    Born: array[0..17] of AnsiChar;
    Address: array[0..71] of AnsiChar;
    IDCardNo: array[0..37] of AnsiChar;
    GrantDept: array[0..31] of AnsiChar;
    UserLifeBegin: array[0..17] of AnsiChar;
    UserLifeEnd: array[0..17] of AnsiChar;
    Reserved: array[0..37] of AnsiChar;
    PhotoFileName: array[0..254] of AnsiChar;
  end;  IDCardData  = tagIDCardData;
  TCardMsg = ^IDCardData;//我是这样子引用的:
var
  MyCardData:TCardMsg;
begin
  lblName.Caption :=  MyCardData.Name;
end;结果显示有乱码?我试过用简体转繁体的函数,但是转过来还是一样的有乱码。(乱码为'?'号)

解决方案 »

  1.   

    用这个函数试试,有点复杂,不过我用的可以!
    function UnicodeEncode(Str:string;CodePage:integer):WideString;
    var
      Len:integer;
    begin
      Len:=Length(Str)+1;
      SetLength(Result,Len);
      Len:=MultiByteToWideChar(CodePage,0,PChar(Str),-1,PWideChar(Result),Len);
      SetLength(Result,Len-1); //end is #0
    end;function Utf8Encode(const WS: WideString): UTF8String;
    var
      L: Integer;
      Temp: UTF8String;
    begin
      Result := '';
      if WS = '' then Exit;
      SetLength(Temp, Length(WS) * 3); // SetLength includes space for null terminator
      L := UnicodeToUtf8(PChar(Temp), Length(Temp)+1, PWideChar(WS), Length(WS));
      if L > 0 then
        SetLength(Temp, L-1)
      else
        Temp := '';
      Result := Temp;
    end;
    function UnicodeDecode(Str:WideString;CodePage:integer):string;
    var
      Len:integer;
    begin
      Len:=Length(Str)*2+1;  //one for #0
      SetLength(Result,Len);
      Len:=WideCharToMultiByte(CodePage,0,PWideChar(Str),-1,PChar(Result),Len,nil,nil);
      SetLength(Result,Len-1);
    end;function Gb2Big5(Str:string):string;
    begin
      SetLength(Result,Length(Str));
      LCMapString(GetUserDefaultLCID,LCMAP_TRADITIONAL_CHINESE,
        PChar(Str),Length(Str),
        PChar(Result),Length(Result));
      Result:=UnicodeDecode(UnicodeEncode(Result,936),950);
    end;function Big52Gb(Str:string):string;
    begin
      Str:=UnicodeDecode(UnicodeEncode(Str,950),936);
      SetLength(Result,Length(Str));
      LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE,
        PChar(Str),Length(Str),
        PChar(Result),Length(Result));
    end;
      

  2.   

    我将我了解的说说,可能不全对,
    不要以为繁体字就是可以在繁体系统上正确显示的,繁体字有时候也是 GBK 编码的。
    繁体系统用的是 big5 字符集,简体系统用的是GBK字符集,而且,GBK 是包含了 BIG5 字符集编码的,所以,在简体系统下面简繁互转可能没有什么问题,在繁体系统下面就会缺少东西了,反映出来就 ???? 这样的东西。
    所以,最好先规定一种编码方法(例如同一为UTF8)再写入数据库,读取的时候就好办了。这个是我以前研究简繁转换的时候记得的片段,现在问我要具体方案我也不知道了。
      

  3.   

    关键是这个信息是从第二代身份证阅读器读出为的信息。也就是说是记录在身份证内部芯片内的一组信息,
    至于他记录的是什么编码格式,我不知道,我只有他们给的SDK开发包,只知道读出来的是简体字,至于什么字符集就不知道了。。大位大哥对字符集比较了解的。麻烦指点迷津啊。