Thanks Simon, problem solved with two ways

********************************************
First option:
            var dbPath2 =
Path.Combine(Windows.Storage.ApplicationData.Current.RoamingFolder.Path,
"test.db");

            string utf8String = String.Empty;

            // Get UTF16 bytes and convert UTF16 bytes to UTF8 bytes
            byte[] utf16Bytes = Encoding.Unicode.GetBytes(dbPath2);
            byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode,
Encoding.UTF8, utf16Bytes);

            // Fill UTF8 bytes inside UTF8 string
            for (int i = 0; i < utf8Bytes.Length; i++)
            {
                // Because char always saves 2 bytes, fill char with 0
                byte[] utf8Container = new byte[2] { utf8Bytes[i], 0 };
                utf8String += BitConverter.ToChar(utf8Container, 0);
            }


            string dbPath = utf8String;

            var db = new SQLite.SQLiteConnection(dbPath)
**************************************
Second option (In Sqlite.cs comes when you add the reference)

        public SQLiteConnection(string databasePath, bool
storeDateTimeAsTicks = false)
        {
            DatabasePath = databasePath;
            Sqlite3DatabaseHandle handle;
            var r = SQLite3.Open16(DatabasePath, out handle);
            Handle = handle;
            if (r != SQLite3.Result.OK)
            {
                throw SQLiteException.New(r, String.Format("Could not
open database file: {0} ({1})", DatabasePath, r));
            }
            _open = true;

            StoreDateTimeAsTicks = storeDateTimeAsTicks;

            BusyTimeout = TimeSpan.FromSeconds(0.1);
        }
******************************************


However, does every developer have to write or change his code like
this? (Because, applications are worldwide and many users affected by
this problem, examples from Tim Heuer's blog:
http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx#65397
http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx#65427
http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx#65692
)


On Wed, Mar 13, 2013 at 3:48 PM, Simon Slavin <slav...@bigfraud.org> wrote:
>
> On 13 Mar 2013, at 11:45am, Ercan Özdemir <eozdemi...@gmail.com> wrote:
>
>> I have some applications in Windows 8 store using SQLite as database.
>> I discovered that if there are any non-English character in logged on
>> username, SQLite couldn't open datase file.
>>
>> Here is my test code:
>>
>>            string dbPath =
>> Path.Combine(Windows.Storage.ApplicationData.Current.RoamingFolder.Path,
>> "test.db");
>
> The value of "Windows.Storage.ApplicationData.Current.RoamingFolder.Path" 
> includes the username.  So if the user has non-Roman characters in their 
> name, the path passed to "ne SQLite.SQLiteConnection()" will also include 
> non-Roman characters in its name.  I don't think "new 
> SQLite.SQLiteConnection()" is handing your special characters correctly.  
> This implies that dbPath contains text in a code page which is not Unicode.
>
> SQLite itself handles this by having a two ways to open a database file: one 
> which expects UTF-8 and the other expects UTF-16.  I don't know which one 
> "new SQLite.SQLiteConnection()" calls.  But you should be able to convert 
> your dbPath value to UTF-8 or UTF-16 using some Operating system call, and 
> pass the converted version of the path.
>
> Simon
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to