+ -
当前位置:首页 → 问答吧 → delphi7显示utf8 问题

delphi7显示utf8 问题

时间:2011-10-19

来源:互联网

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

作者: wyuan_li   发布时间: 2011-10-19

谁说不支持?widestirng

作者: funxu   发布时间: 2011-10-19

难道系统自带的Utf8ToAnsi不行?

作者: lght   发布时间: 2011-10-19

使用Tnt元件来处理。

作者: SmallHand   发布时间: 2011-10-19



//将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; 

作者: jingtuzhong   发布时间: 2011-10-19