Hi, I have a small patch for the SQLite Shell 3.9.2, it convert sql command text to utf-8 before sending to SQLite engine, And convert the result text back to default code page after sqlite3_exec.
Before patch( SQLite shell in windows 10 Chinese version): SQLite version 3.9.2 2015-11-02 18:31:45 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> select length('????'); 6 sqlite> select substr('????',1,1); sqlite> select substr('????',2,1); sqlite> select substr('????',3,1); sqlite> select substr('????',4,1); ? sqlite> select instr('????','?'); 3 After patch: sqlite> select length('????'); 4 sqlite> select substr('????',1,1); ? sqlite> select substr('????',2,1); ? sqlite> select substr('????',3,1); ? sqlite> select substr('????',4,1); ? sqlite> select instr('????','?'); 2 sqlite> ---------------diff.txt------------cut here--------------------------------------------------- 817c817 < char **azArg, /* Text of each result column */ --- > char **azArgZ, /* Text of each result column */ 821a822,842 > #if defined(_WIN32) || defined(WIN32) > char** azArg = malloc(sizeof(char*)*nArg); > for (i = 0;i < nArg;i++) { > if (azArgZ[i] == 0) > azArg[i] = 0; > else { > int nlen = MultiByteToWideChar(CP_UTF8, 0, azArgZ[i], -1, > NULL, 0); > assert(nlen > 0); > WCHAR* buff = (WCHAR*)malloc(nlen * sizeof(WCHAR)); > (void)MultiByteToWideChar(CP_UTF8, 0, azArgZ[i], -1, buff, > nlen); > int ilen = WideCharToMultiByte(CP_ACP, 0, buff, nlen, NULL, > 0, NULL, NULL); > assert(ilen > 0); > char* buff1 = (char*)malloc(ilen); > (void)WideCharToMultiByte(CP_ACP, 0, buff, nlen, buff1, ilen, > NULL, NULL); > azArg[i] = buff1; > free(buff); > } > } > #else > char** azArg = azArgZ; > #endif 1042a1064,1070 > #if defined(_WIN32) || defined(WIN32) > for (i = 0;i < nArg;i++) { > if (azArg[i]) > free(azArg[i]); > } > free(azArg); > #endif 4255,4257c4283,4301 < BEGIN_TIMER; < rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); < END_TIMER; --- > #if defined(_WIN32) || defined(WIN32) > int nlen = MultiByteToWideChar(CP_ACP, 0, zSql, -1, 0, 0); > assert(nlen > 0); > WCHAR* buff = (WCHAR*)malloc(nlen * sizeof(WCHAR)); > (void)MultiByteToWideChar(CP_ACP, 0, zSql, -1, buff, nlen); > int ilen = WideCharToMultiByte(CP_UTF8, 0, buff, nlen, NULL, 0, NULL, > NULL); > assert(ilen > 0); > char* buff1 = (char*)malloc(ilen); > (void)WideCharToMultiByte(CP_UTF8, 0, buff, nlen, buff1, ilen, NULL, > NULL); > free(buff); > BEGIN_TIMER; > rc = shell_exec(p->db, buff1, shell_callback, p, &zErrMsg); > END_TIMER; > free(buff1); > #else > BEGIN_TIMER; > rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); > END_TIMER; > #endif --------------------------------cut here----------------------------------------------