Delphi中讓sqlite顯示Unicode

最近作了一個小程序,用到了SQLite,後臺用Python寫的分析程序,將數據插入(更新)到SQLite數據庫中,Delphi的程序週期顯示數據庫的內容。Delphi訪問SQLite採用的Aducom組件。Python插入的數據編碼都是採用的UTF-8,而Delphi的DBGrid、cxGrid控件顯示的倒是亂碼,主要是由於Delphi7不支持Unicode形成的,所以要想辦法讓他支持。
嘗試了多種方法,包括使用聽說支持Unicode的TMS Unicode Component、SUIPack等,都很差使。最後仍是用了簡單的方法,在數據集組件的須要顯示的字段的OnGetText事件,在事件處理中,對數據進行Unicode到GB的轉換。

procedure unicode2gb(const unicodestr:string; var GbStr:String);
var SourceLength:integer;
    DoneLength:integer;
    AscNo:integer;
    Byte1,Byte2,Byte3:integer;
begin
GbStr:='';
if Trim(unicodestr)='' then exit;

SourceLength:=Length(UnicodeStr);
DoneLength:=1;
repeat
    AscNo:=ord(UnicodeStr[DoneLength]);
    case (AscNo and $E0) of
    $E0:begin
         Byte1:=(AscNo and $0f) shl 12;
         Inc(DoneLength);
         if DoneLength>SourceLength then break;
         AscNo:=ord(UnicodeStr[DoneLength]);
         Byte2:=(AscNo and $3f) shl 6;
         Inc(DoneLength);
             if DoneLength>SourceLength then break;
         AscNo:=ord(UnicodeStr[DoneLength]);
         Byte3:=AscNo and $3f;
        end;
    $C0:begin
         Byte1:=(AscNo and $1f) shl 6;
         Inc(DoneLength);
         if DoneLength>SourceLength then break;
         AscNo:=ord(UnicodeStr[DoneLength]);
         Byte2:=(AscNo and $3f);
         Byte3:=0;
        end;
    0..$bf:begin
         Byte1:=AscNo;
         Byte2:=0;
         Byte3:=0;
        end;
    end;//case;
     GbStr:=GBStr+widechar(Byte1+Byte2+Byte3);
     Inc(DoneLength);
     if DoneLength>SourceLength then break;
until DoneLength>=SourceLength;
end;
另外,在用cxGrid進行顯示的時候,要根據字段的值進行顏色的設置,這個能夠在TableView的Styles的OnGetContentStyle事件中進行處理,以下所示:
procedure TFormMain.cxGrid1DBTableView1StylesGetContentStyle(
    Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
    AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
var
    attention : integer;
begin

    attention := ARecord.Values[5];

    if attention > 0 then
    begin
        AStyle := styleAttention;
        exit;
    end;

    if ARecord.Values[4] = 0 then
    begin
        AStyle := styleRed;
    end
    else
    begin
        AStyle := styleDefault;
    end;
end;
其中styleAttention、styleDefault等是放在cxStyleRepository1中的設定好的各類Style。
相關文章
相關標籤/搜索