Thanks for the responses. I tried what I could, but it still doesn't work.
I wrote some code to test if I can open and close a file. The C code works
but the Chicken code doesn't.

---------- test.c ----------

#include <stdio.h>
#include <wchar.h>

// this file needs to be saved with explicit BOM (byte order mark)
otherwise it won't work
int main()
{
    FILE* fileHandle = _wfopen(L"c:\\temp\\íűőúöüóéá.txt", L"r");
    printf("File has been opened at: %p\n", fileHandle);
    printf("Closing file\n");
    fclose(fileHandle);
    return 0;
}

---------- test.scm ----------

(import (chicken foreign))

(foreign-declare "#include <stdio.h>")
(foreign-declare "#include <wchar.h>")

(define chicken_wfopen
    (foreign-lambda (c-pointer "FILE") "_wfopen" (c-pointer "wchar_t")
(c-pointer "wchar_t")))
(define chicken_fclose
    (foreign-lambda int "fclose" (c-pointer "FILE")))

(let ([file-handle (chicken_wfopen "c:\\temp\\íűőúöüóéá.txt" "r")])
    (print "File has been opened at: " (number->string file-handle))
    (print "Closing file.")
    (chicken_fclose file-handle))

The Chicken code fails with the error message: Error: unbound variable:
It doesn't say the name of the variable, and it returns the error code 70.
Note that in C the string needs to be prefixed with an L to make it wide
character. In Chicken I don't know how to do that.
Does anybody have a clue which variable is unbound?

Op ma 25 dec 2023 om 20:19 schreef John Cowan <co...@ccil.org>:

>
>
> On Mon, Dec 25, 2023 at 6:07 AM <felix.winkelm...@bevuta.com> wrote:
>
>
>> I'm not too familiar with the way Windows handles non-ASCII characters
>> in operating system calls, but I assume that what gets passed to the C
>> library runtime functions like fopen(3), etc. assumes a particular
>> encoding.
>>
>
> Basically, there are two modes, one that assumes a particular encoding, as
> you say (that's the default) and one that assumes wchar_t, which is always
> UTF-16LE.  Which encoding is used in the first mode depends on the locale
> setting.
>
> From a quick glance at the Windows docs[1] it seems one needs to use
>> "_fwopen" with a wchar_t string argument to pass extended characters.
>>
>
> Indeed, except that it's _wfopen, not _fwopen. Note that _fopen can
> involve 8-bit, 16-bit, or 8/16-bit mode depending on the encoding.
>
> Sorry, if this is not overly helpful. We are currently in the process of
>> improving
>> the unicode support for the next major version of CHICKEN.
>>
>
> This makes me realize that posixwin needs to be changed in C6 so that it
> always uses the second mode.  A simple way to do this is to use a UTF-8 to
> UTF-16BE converter (and vice versa for things like dirread) right before
> calling _fwopen.
>
>
>>
>> felix
>>
>>
>>

Reply via email to