Hi all,
I saw no more comments on this suggestion. It is very simple to program
around this issue in user code, but I would like to see it fixed in the
library level. Unless someone has made this work-around in his code, an
application cannot work at the same time in Win9x and Win2k if there is any
ansii char in the filepath.
Costas


> -----Original Message-----
> From: Costas Stergiou [mailto:[EMAIL PROTECTED]
> Sent: Saturday, August 05, 2006 11:47 PM
> To: sqlite-users@sqlite.org
> Subject: RE: [sqlite] Problems opening db in win9x and utf8 filename
> 
> 
> >
> > I no longer have a win98 system to test with, but based on my
> > understanding...
> >
> > os_win.c attempts to convert the filename from UTF-8 to UTF-16.  If it
> > succeeds, it calls CreateFileW;
> Actually, there is a flag there that caused the convertion to UTF-16 to
> 'fail' (it doesn't really fail, just that the utf8ToUnicode returns 0).
> 
> > if it fails, it calls CreateFileA with
> > the original string.
> Exactly
> 
> > CreateFileW is a nonfunctional stub on win98, so
> > when you pass a UTF-8 filename sqlite takes that codepath and fails.
> > An ANSI filename won't pass the UTF-8 conversion, so CreateFileA is
> > called with the ANSI string.
> Actually, in Win98 it will pass the conversion, but as I said above, the
> function fails by a check: "if (!isNT())"
> 
> > That doesn't necessarily explain win2k though.  Perhaps the current
> > user locale does not match the ANSI encoding of the filename you're
> > passing in?  Internally win2k only uses the Unicode version, so
> > CreateFileA must do an implict conversion to Unicode using the current
> > user codepage.
> Now that I checked the code, it actually does.
> Unfortunately, the way the code is setup makes it necessary for the caller
> to check in which OS it runs and either use UTF8 paths or ansii ones. I
> think this is not a good technique (and not actually intended from what I
> have read in the docs) since the sqlite3_open does not give a truly
> uniform
> interface to the caller.
> 
> My suggestion is this:
> The sqlite3_open should always expect a utf8 path (as the docs say). If in
> win2k everything works fine. If in win98 it should convert the path to
> utf16
> and THEN convert it to ansii using the CP_ACP (current ansii code page).
> This will work for 99.9% cases since in non-English win9x OS, almost 99.9%
> ansii strings are in the system's locale.
> I think this is also the expected behavior (and what I have programmed my
> app to do, until I tested it in win98).
> 
> To make these changes, all the logic of os_win.c should change to
> accommodate the above. I would certainly say that the way it currently
> works
> is wrong (bug).
> Of course, there is the problem of breaking existing code (since many
> win9x
> user will not have read the docs, or else someone would have mentioned
> this
> behavior looong time agoe).
> To maintain compatibility (e.g. to accept ansii non-utf8 paths), a check
> can
> be made on whether the supplied path is in utf8 (heuristically this has
> almost 100% success) and then do the above.
> 
> Costas
> 
> 
> 
> > MSLU does provide a functional CreateFileW wrapper for win9x, but I
> > don't believe the stock sqlite binaries are built with it.
> >
> >
> > On 8/5/06, Peter Cunderlik <[EMAIL PROTECTED]> wrote:
> >
> > > I think you will never succeed using UTF-8 encoded filenames on those
> > > systems. I don't know how it can be done programmatically, but each
> > > file or directory name has its 8.3 name as well, i.e. "Program Files"
> > > would be "progra~1". I think this is the safest way how to pass
> > > filenames to SQLite. It should work on Win 9x as well as 2K and XP.
> >
> > NTFS can have 8.3 shortname creation disabled.  Systems running
> > without it are not common but do exist, so you should avoid relying on
> > them if at all possible.



Reply via email to