开发环境:delphi7 + sqlite, 因为sqlite 内部编码是以utf-8编码方式保存的,而delphi 不支持unicode 字符显示
我dbgrid 控件上显示的中文全是乱码,请问下有没有好的方法把utf8 转化为ansistring
网上找了下有网友自己写的函数转化不全,字符太长的话就截掉了,帮忙想想招吧
我dbgrid 控件上显示的中文全是乱码,请问下有没有好的方法把utf8 转化为ansistring
网上找了下有网友自己写的函数转化不全,字符太长的话就截掉了,帮忙想想招吧
解决方案 »
- 谁来优化下函数,webbrowser的POST发送
- delphi 将100个数字平均分布到600个数组里
- 如何用TOleContainer已只读方式打开word、Excel等文件?
- quickreport 加急!!!
- 怎样便于团队开发Delphi三层
- 怎么得到线程的文件名?像2000的线程清单似的?
- 高分求救:C/S系统在两地通过动态Ip相连成功使用,但最近电信局关闭PING功能,两地就不能连上,但两地可以通过PCANYWHERE互联,请问有什
- 怎樣pan別oldvalue和newvalue的数据是一样﹐
- 大家来讨论编写游戏的方法和步骤
- flash文件播放器放大缩小窗体不能正确刷新问题?
- 学delphi快要学疯了
- 如何读取c:\2.txt里最后一条数据的空格间的数据分配给变量
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;