Re: charset issue on Windows help needed



On Saturday 13 September 2014 14:38:39 Fernando Rodriguez wrote:
On Saturday 13 September 2014 10:37:27 AM Geert Janssens wrote:

On Wednesday 10 September 2014 21:25:30 Fernando Rodriguez wrote:
On Wednesday 10 September 2014 5:07:03 PM Fernando Rodriguez

wrote:
On Wednesday 10 September 2014 7:37:28 PM Geert Janssens wrote:
Hi,

I'm stuck on the following issue. Program is GnuCash on Windows.

Consider the following code snippet:

struct stat statbuf;
gchar* dirname = g_strdup(g_getenv("GNC_DOTGNUCASH_DIR");
gint rc = g_stat (dirname, &statbuf);

switch (errno)
{

  case ENOENT:
    // Directory doesn't exist
    // Here is code to create it which I cut for brevity
    break;
  
  case EACCES:
    // Directory can't be accessed
    exit(1);
  
  case ENOTDIR:
    // Not a directory
    exit(1);
  
  default:
    // Unknown error
    exit(1);

}

// Continue code with valid, existing directory
...

So this snippet reads the value of environment variable
GNC_DOTGNUCASH_DIR and tests whether this is a valid directory.

This works fine when GNC_DOTGNUCASH_DIR uses a limited

character

set like ascii. For example when set to "c:\gcdev\geert" this
works well and the code continues.

However if set to for example:
c:\gcdev\Łukasz
Things go wrong (note the unusual Ł).

In this case the code branches into case ENOENT and creates a
directory named c:\gcdev\Lukasz (note the plain L now)
Before it continues.

Setting a breakpoint at rc=g_stat... and examining the value of
dirname at that point also shows it to have a value of
c:\gcdev\Lukasz (with plain L).

So it seems I'm losing diacritical information here and I can't
pass the right directory to my code to use.

What should I do to get the real value from the environment to
be
able to access the true directory ?

Thanks,

Geert

P.S. my locale settings are all "Dutch_Belgium.1252" except for
LC_ALL which is empty.
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Well gchar is a typedef for char so it only supports ascii. I
think
you'll probably have to use Win32 API calls on Windows to access
multibyte file names.

Also according to the documentation you should use GStatBuf
instead
of struct stat on Windows to get consistent behaviour on different
compilers.



_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Actually try using g_utf8_strncpy() instead of g_strdup(). I'm not
sure if that'll get you all the way as the docs say g_stat calls the
standard library functions and AFAIK those dont support
unicode/multibyte filenames.

Thanks for the suggestion.

However it won't make a difference because the string I get from
g_getenv is already wrong. I can see this in gdb if I set a
breakpoint on the g_stat line.

If I issue
print (gchar*) g_getenv ("GNC_DOTGNUCASH_DIR")
it prints
"c:\\gcdev\\Lukasz"

So you may well be right I need something other than g_stat. I can
only test that however when I manage to get the right string from the
environment. :(

Geert



GLib's g_getenv documentation says: "On Windows, it is in UTF-8."
Is it possible that gdb doesn't handle it correctly? perhaps try
g_print or look at the bytes in memory?

print ((gchar*) g_getenv ("GNC_DOT_DIR"))[9]
= 76 'L'
print ((gchar*) g_getenv ("GNC_DOT_DIR"))[9]
= 76 'L'
= 117 'u'


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]