Mail Archives: cygwin/2006/03/19/21:12:46
Igor Peshansky wrote:
> On Fri, 17 Mar 2006, Paul J. Lucas wrote:
>
>> On Fri, 17 Mar 2006, Christopher Faylor wrote:
>>
>>> Cygwin doesn't provide _wfopen.
>> 1. I install Cygwin.
>> 2. It's in stdio.h that gets installed as part of the Cygwin install.
>
> No, actually it's in stdio.h that's part of MinGW (and is installed as
> part of Cygwin only because Cygwin's gcc has a built-in MinGW
> cross-compiler).
Just in case anyone out there is still interested in the actual
question... :)
The Right Way to do this (open a file whose name is given in UTF-8), or
as close to a Right Way as you can get under the circumstances, is to
use iconv() to convert the file name to the local multibyte character
set, and then use plain fopen() on that. In iconv_open(), use "utf-8"
for the source character set, and an empty string for the target
character set. (This isn't 100% portable; the Posix standard doesn't
specify the character set names that can be used in iconv_open(). Every
implementation understands "utf-8", but some use "char" instead of "" to
mean "the local multibyte character set, whatever that happens to be".)
If your file name contains characters that can't be represented in the
local MBCS, you're out of luck. Cygwin only supports multibyte file
names (not Cygwin's fault, it's a Posix limitation); to use the full
Unicode character set in a file name you have no choice but to fall back
on the Windows API. (You can use both the Windows and Cygwin APIs in the
same program, that doesn't cause any problems, other than to portability.)
Technically the above procedure also contains a race condition, since
it's theoretically possible for the native multibyte character set to
change (via the system's locale settings) between the calls to iconv()
and fopen(). Again, this is a problem in the Posix API and can't be
portably worked around. If you don't care about portability and just
want something that works with Cygwin, you might as well just use the
Windows API.
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -