在使用DelphiXE3和SQLite3進行程式開發時,解決最後一個字元亂碼的問題
阿新 • • 發佈:2019-02-12
在使用DelphiXE3和SQLite3進行程式開發時,如果使用原版的SQLiteTable3,當使用UTF8Decode函式之後,可能依然存在亂碼問題,一個表現就是,最後一個漢字顯示為框,後面跟一個問號,其他的漢字解碼正常。
後來跟蹤了一下SQLiteTable3的原始碼,從SQLite獲取的字串資料是正確的,但是因為TSQLiteTable的建構函式在讀取SQLite返回的UTF8字串時使用了setstring函式,強行將資料欄位進行了轉換,引起字串長度出現錯誤,所以在UTF8Decode解碼時出現了漏解碼的問題。
這裡給出一種解決方案,修復了該Bug。
1.將TSQLiteTable的建構函式Create中的setstring行改為:
Var
strStr: String;
strValue: PWideChar;
//****************************************
strStr := UTF8Decode(AnsiString(ptrValue));
strValue := PWideChar(strStr);
setstring(thisStringValue^, strValue, strlen(strValue));
因為在delphixe3中,setstring函式的第二個引數是PChar,也就是PWideChar型別。
2.在面在呼叫時,不需要再UTF8Decode解碼