Re: charset issue on Windows help needed



On Tuesday 16 September 2014 21:19:51 Fernando Rodriguez wrote:
On Tuesday 16 September 2014 6:56:11 PM Geert Janssens wrote:
On Saturday 13 September 2014 14:24:35 Fernando Rodriguez wrote:
On Saturday 13 September 2014 4:21:18 PM Geert Janssens wrote:
Thanks a lot !

I'll try to apply a similar approach in gnucash for the
home dir use case.

For my second case, anybody know how to read an
environment variable directly in win32 using wide char
functions ?


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

You'd use the GetEnvironmentVariable function. What compiler and
IDE
are you using?

I'm using mingw32, gcc 4.8.1.

In Windows every API function that deals with text has two
variants,
so theres GetEnvironmentVariableA and GetEnvironmentVariableW.

If you use Visual Studio there's an option on project properties
to
select the encoding and it #defines a symbol that defines the
macros
to call either variant and you would use the TCHAR (there's a
bunch
of typedefs for dealing with strings for example LPTSTR, LPSTR,
LPWSTR but they all boil down to the same thing, in this case
LPSTR
is typedef for char*, LPWSTR wchar_t*, and LPTSTR is char* for
ansi
and wchar_t* for unicode) type to store the strings (it's a
typedef
for char when using ANSI and wchar_t when using unicode). I'm not
sure what the symbol is called so if you're not using VS you can
just
use the wide char variants directly or look at the headers and
find
out what you need to define.

Thanks for the additional detail (for some reason my previous mail
got
truncated by the list

software.

I have now written this function:

#ifdef G_OS_WIN32
#define BUFSIZE 4096
static gchar* get_env_utf8 (const gchar* var_name)
{

    LPWSTR val_win;
    gchar *val_utf8;
    guint32 retval;
    
    ENTER();
    val_win = (LPWSTR) malloc (BUFSIZE*sizeof(WCHAR));
    if (!val_win)
    
        return NULL; /* Out of memory... */
    
    retval = GetEnvironmentVariableW (g_utf8_to_utf16 (var_name, -1,
    NULL,
NULL, NULL),

val_win, BUFSIZE);

    if (0 == retval)
    
        return NULL;  /* Variable not set */
    
    if (BUFSIZE < retval)
    {
    
        PWARN("Value of environment variable GNC_DOT_DIR is longer
        than %d.

"

              "The code can't handle this, so returning NULL
              instead.",

BUFSIZE);

        return NULL; /* Woa, path is way to long... */
    
    }
    
    if ((val_utf8 = g_utf16_to_utf8 ((gunichar2*) val_win, -1, NULL,
    NULL,
NULL)) != NULL)

        return val_utf8;
    
    else
    
        return NULL;

}
#endif

But in the end val_utf8 still doesn't keep the special characters.

If the environment variable GNC_DOT_DIR is set to "c:\gcdev\Ɓukasz",
val_win
is printed in

gdb as L"c:\\gcdev\\Lukasz" and
val_utf8 as "c:\\gcdev\\Lukasz"

If I examine the individual characters using
print val_win[9] and print val_win[10] those result in
L'L' and L'u'. To me that looks as if there are no wide characters
in the
original string. :(

This is really puzzling me. What am I missing ?

Geert

Sorry for taking so long, I've been struggling with something of my
own. Did you ever get this sorted?


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