开发环境:delphi7 + sqlite, 因为sqlite 内部编码是以utf-8编码方式保存的,而delphi 不支持unicode 字符显示
我dbgrid 控件上显示的中文全是乱码,请问下有没有好的方法把utf8 转化为ansistring
网上找了下有网友自己写的函数转化不全,字符太长的话就截掉了,帮忙想想招吧

解决方案 »

  1.   

    难道系统自带的Utf8ToAnsi不行?
      

  2.   

    //将UTF-8字符串转为代码页为CodePage的AnsiString。 
    function UTF8ToAnsiString(utf8str:string; CodePage:integer):AnsiString; 
    var 
     i:integer; 
     buffer:widestring; 
     ch,c1,c2:byte; begin 
     result:=''; 
     i:=1; 
     while i<=Length(utf8str) do begin 
       ch:=byte(utf8str[i]); 
       setlength(buffer,length(buffer)+1); 
       if (ch and $80)=0 then //1-byte 
          buffer[length(buffer)]:=widechar(ch) 
       else begin 
       if (ch AND $E0) = $C0 then begin // 2-byte 
          inc(i); 
          c1 := byte(utf8str[i]); 
          buffer[length(buffer)]:=widechar((word(ch AND $1F) SHL 6) OR (c1 AND $3F)); 
        end 
        else begin // 3-byte 
          inc(i); 
          c1 := byte(utf8str[i]); 
          inc(i); 
          c2 := byte(utf8str[i]); 
          buffer[length(buffer)]:=widechar( 
            (word(ch AND $0F) SHL 12) OR 
            (word(c1 AND $3F) SHL 6) OR 
            (c2 AND $3F)); 
        end; 
        end; 
       inc(i); 
      end; //while 
      i := WideCharToMultiByte(codePage, 
               WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, 
               @buffer[1], -1, nil, 0, nil, nil); 
      if i>1 then begin 
        SetLength(Result, i-1); 
        WideCharToMultiByte(codePage, 
            WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR, 
            @buffer[1], -1, @Result[1], i-1, nil, nil); 
      end; 
    end; 
      

  3.   

    本来unicode的字符集就比gb的大,就是说,gb里面有的字,unicode里一定有。但反过来就不是了这就是为什么一般是gb转unicode显示而不是反过来。 你还是找个显示unicode的控件吧