http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48972
Summary: OPEN with Unicode file name Product: gcc Version: 4.7.0 Status: UNCONFIRMED Keywords: accepts-invalid, diagnostic Severity: normal Priority: P3 Component: fortran AssignedTo: unassig...@gcc.gnu.org ReportedBy: bur...@gcc.gnu.org CC: jvdeli...@gcc.gnu.org This PR is motivated by the thread which started at https://www.jiscmail.ac.uk/cgi-bin/webadmin?A2=COMP-FORTRAN-90;59308f3c.1105 GNU Fortran happily accepts kind=4 character strings to the FILE= argument of the OPEN statement - and probably also to the other string arguments. However, the Fortran 2008 standard has: R905 connect-spec is ... or FILE = file-name-expr with R906 file-name-expr is scalar-default-char-expr Thus, such strings should be rejected -- at least with -std=f2008. * * * Independent of that, it would be convenient if as vendor extension passing a UCS-4 string would be allowed. The only problem is how it should be handled in the library. For Unix systems, I think converting the UCS-4 to UTF-8 and using it in the normal file open should work. However, for Windows, I think one needs a special solution as Windows seems to use UTF-16 everywhere [1]. Thus, one should be able to directly pass the UCS-16 file name to CreateFileW [2]. [1] http://msdn.microsoft.com/en-us/library/dd374081%28v=vs.85%29.aspx [2] http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx Example program. Sample usage: $ gfortran test.f90 $ ./a.out Enter filename: ファイル $ Should create "ファイル.dat" with the content "Hello World and Ni Hao -- 你好" - the latter works but the file name is as written above "?" (= \343). If one passes "44", the created file is just "4". use iso_fortran_env implicit none integer, parameter :: ucs4 = selected_char_kind ('ISO_10646') character(len=30, kind=ucs4) :: str integer :: unit open(unit=INPUT_UNIT, encoding='utf-8') write(*, '(a)', advance='no') 'Enter filename: ' read(*,*) str open(newunit=unit, file=trim(str)//ucs4_'.dat', encoding='utf-8') write(unit, '(a)') ucs4_'Hello World and Ni Hao -- ' & // char (int (z'4F60'), ucs4) & // char (int (z'597D'), ucs4) close(unit) end