Costas Stergiou wrote:
Hi John, Have you tried to use sqlite3_open with a path that contains non-ascii charsand make it work at the same time in Win9x and win2K? The 2 apps I mentioned before (sqLiteExplorer and SQLiteSpy) both fail theabove test (and for a good reason) CostasP.S. As I said, you can make an app work on both of these OSs, but withexternal manipulation.-----Original Message----- From: John Stanton [mailto:[EMAIL PROTECTED] Sent: Tuesday, August 08, 2006 11:13 AM To: sqlite-users@sqlite.org Subject: Re: [sqlite] Problems opening db in win9x and utf8 filename Our Sqlite applications work not only on Win98 and Win2000 but also on Linux, AIX and Solaris. Where did we go wrong? Costas Stergiou wrote: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 isanyansii 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 filenameI 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.ExactlyCreateFileW 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 thecallerto 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 whatIhave 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). Ifinwin2k 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, almost99.9%ansii strings are in the system's locale. I think this is also the expected behavior (and what I have programmedmyapp 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. CostasMSLU 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.