[GHC] #5599: msys has bad Unicode support

GHC cvs-ghc at haskell.org
Thu Nov 3 10:28:24 CET 2011


#5599: msys has bad Unicode support
---------------------------------+------------------------------------------
    Reporter:  simonpj           |        Owner:              
        Type:  bug               |       Status:  new         
    Priority:  normal            |    Milestone:              
   Component:  Compiler          |      Version:  7.2.1       
    Keywords:                    |     Testcase:              
   Blockedby:                    |   Difficulty:              
          Os:  Unknown/Multiple  |     Blocking:              
Architecture:  Unknown/Multiple  |      Failure:  None/Unknown
---------------------------------+------------------------------------------
 Tests `3307` `environment001` pass on Cygwin, Linux, fail on `msys`:
 {{{
 >    lib/IO                        3307 [bad exit code] (normal)
 >    lib/IO                        environment001 [bad stdout] (normal)
 }}}
 Here is Max's diagnosis:

 Basically, msys has kind of bad Unicode support. If you write a program
 "len.c" like this:
 {{{
 #include <windows.h>
 #include <stdio.h>
 #include <string.h>

 int main(int _argc, char **_argv) {
         LPWSTR cmdLine = GetCommandLineW();

         int argc;
         LPWSTR *argv = CommandLineToArgvW(cmdLine, &argc);

         printf("%d args, %d wide chars in first arg\n", argc,
 wcslen(argv[1]));
         return 0;
 }
 }}}
 Create a UTF-8 encoded file called "utf8" containing two characters:
 {{{
 不好
 }}}

 And then execute it like so:
 {{{
 gcc len.c && ./a.exe $(cat utf8)
 }}}

 (NB: it is irrelevant whether you use Cygwin gcc or msys gcc: this is an
 issue with the ''shells'')

 You get different results on msys and Cygwin:

  * On Cygwin, you get 2 wide characters in the first argument; i.e. the
 UTF-16 encoded Chinese text
  * On msys, you get 6 wide characters in the first argument; i.e. one
 16-byte value for ''every byte'' in the UTF-8 encoded Chinese text

 IMHO the msys behaviour is broken because the command line arguments
 supplied via the Windows API are meant to be UTF-16. It ''does'' match the
 behaviour of Windows cmd if you do this:

 {{{
 set /p myvar= < utf8
 a.exe %myvar%
 }}}

 (You get "6 wide characters" printed)

 Perhaps the issue in cmd stems from the fact that the Windows console is
 stuck in code page 850 and doesn't support the UTF-8 "code page".
 But msys really has no excuse since it reports itself as being UTF-8.

 I'm not sure what to do here because I don't think our code actually has a
 problem, and the test does pass (and check something useful) in Linux, OS
 X and Cygwin. But still, something is not working quite right here.
 Perhaps just mark it as expect-fail in msys?

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5599>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the Glasgow-haskell-bugs mailing list