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----------------------------------------------

Reply via email to