[英]how to store UTF-8 encoding data to sqlite3 using Visual C++
我已經創建了一個編碼為UTF-8(默認)的sqlite數據庫。
然后,我使用以下語句插入數據:
strcpy(sql,"insert into blog(title) values('呵呵')");
sqlite3_exec(db,sql,0,0,0);
然后我打開SQLite數據庫用的工具,叫做sqlite的開發價值title
欄顯示ºǺ
在數據編碼垃圾代碼:UNICODE。 然后我將數據編碼更改為ANSI , title
值顯示為正確。
據我所知sqlite3_exec
原型是:
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
我仍然嘗試將wchar_t
類型傳遞給sql
,但仍然wchar_t
。
我的Visual C ++項目已經定義了UNOCODE
和_UNICODE
,所以我的問題是: 如何使用Visual C ++將UTF-8編碼數據存儲到sqlite3?
更新(問題已解決)
我使用iconv將GBK編碼轉換為msandiford啟發的UTF-8 。 非常感謝msandiford。
char* pOut;
char* pIn;
size_t inLen,outLen=2000;
strcpy(sql,"insert into blog(title) values('呵呵')");
string strSQL = sql;
char* sql2 = (char*)malloc(2000);
memset(sql2,0,2000);
pOut = &sql2[0];
inLen = strlen(strSQL.c_str());
pIn = const_cast<char*>(strSQL.c_str());
iconv_t g2u8 = iconv_open("UTF-8","GBK");
iconv(g2u8,(const char**)&pIn,&inLen,&pOut,&outLen);
sqlite3_exec(db,sql2,0,0,0);
將評論收集到答案中:
根據問題注釋,顯然源文件未使用UTF-8編碼。 似乎可以轉換為UTF-8或直接使用UTF-8編碼。
直接使用UTF-8編碼:
strcpy(sql,"insert into blog (title) values ('\xE5\x91\xB5\xE5\x91\xB5')");
您可以通過執行以下操作避免將所有源文件轉換為UTF-8:
sprintf(sql, "insert into blog (title) values('%s')", AnsiToUtf8("呵呵"));
不幸的是, AnsiToUtf8()
函數將特定於平台。
進一步研究,似乎Visual Studio以Windows區域設置的默認編碼保存源文件。 基於此,如果您的開發團隊的計算機針對不同的區域設置,則可能存在多種編碼。
我認為實現AnsiToUtf8()
函數AnsiToUtf8()
在所有可能的情況下都可以應對AnsiToUtf8()
將非常困難,即使不是不可能,尤其是考慮到要在其上開發代碼的計算機的語言環境設置可能與最終運行代碼的計算機。
我認為解決此問題的最干凈方法是在源文件中統一使用UTF-8編碼,假設您要在默認編碼和Unicode重疊的區域之外使用字符串文字中的代碼點。
另一種方法是使代碼國際化,以便源文件不包含擴展字符,並使用諸如GNU gettext之類的東西來處理翻譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.