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