Windows vs UTF-8 (issue 15845)

ag0aep6g via Digitalmars-d digitalmars-d at puremagic.com
Sun Apr 3 14:55:39 PDT 2016


When trying to make sense of issue 15845 [1], I've found Windows 
behaving outright broken. I don't have a clue about Windows programming, 
though, so it's very possible that I'm just missing something. I'd hope so.

Code:
----
import std.stdio;
import std.exception: enforce;
import core.sys.windows.windows;

void main()
{
     SetConsoleCP(65001);
     SetConsoleOutputCP(65001);

     uint readBytes;
     ubyte c;
     ReadFile(GetStdHandle(STD_INPUT_HANDLE), &c, 1, &readBytes, 
null).enforce();
     writeln(readBytes, " ", c);
}
----

This works for ASCII characters. It does not work for non-ASCII 
characters, e.g. 'ü'. ReadFile does not indicate an error, but it also 
doesn't read anything.

I can't find any explanation for this in the documentation for Readfile 
[2] or via Google. The same happens with -m32, -m64, fgetc, fgets. It 
also happens with equivalent C programs compiled with Visual Studio 2015.

I did find out that this apparently only happens when stdin is 
considered a TTY. According to _isatty [3], stdin is not a TTY when I 
use a pipe for input, e.g. `echo ä | test`, and then it works.

Does this make sense to anyone?


[1] https://issues.dlang.org/show_bug.cgi?id=15845
[2] https://msdn.microsoft.com/en-us/library/aa365467.aspx (ReadFile)
[3] https://msdn.microsoft.com/en-us/library/f4s0ddew.aspx (_isatty)


More information about the Digitalmars-d mailing list