Greetings to all!

I work on Windows with cp1251 and I have a mistake in the program:

import std.stdio;
int main (string [] args) {
    string nameFile = `«Ёлки с объектами №876».txt`;
    File f = File (nameFile, "w");
    f.writeln ("Greetings!");
    return 0;
}

This mistake of a kind:

std.exception. ErrnoException@std\stdio.d (372): Cannot open file ` ┬л╨Б ╨╗╨║╨╕ ╨Ю ╨▒
╤К ╨╡╨║╤ 876 ┬╗. txt ' in mode ` w ' (Invalid argument)

For correction of this mistake I had to change a file std\stdio.d,
having added in it function fromUtf8toAnsiW (). The piece of an source code
of a file std\stdio.d with changes is presented more low.

private FILE* fopen(in char[] name, in char[] mode = "r") @trusted // nothrow @nogc - mgw отключено из-за fromUtf8toAnsiW
{
    import std.internal.cstring : tempCString;

    version(Windows)
    {
                // 02.04.2015 8:31:19 repair for dmd 2.067.0
wchar* fromUtf8toAnsiW(in char[] s, uint codePage = 0) @trusted { import std.c.windows.windows: WideCharToMultiByte, GetLastError;
                        import std.windows.syserror: sysErrorString;
                        import std.conv: to;
                        char[] result, rez;     int readLen; auto ws = 
std.utf.toUTF16z(s);
result.length = WideCharToMultiByte(codePage, 0, ws, -1, null, 0, null, null);
                        if (result.length)      {
readLen = WideCharToMultiByte(codePage, 0, ws, -1, result.ptr, to!int(result.length), null, null); for(int i; i != result.length; i++) { rez ~= result[i]; rez ~= 0; } rez ~= 0; rez ~= 0;
                        }
                        if (!readLen || readLen != result.length)       {
throw new Exception("Couldn't convert string: " ~ sysErrorString(GetLastError()));
                        }
                        return cast(wchar*)rez.ptr;
                }

        import std.internal.cstring : tempCStringW;
// return _wfopen(name.tempCStringW(), mode.tempCStringW()); return _wfopen(fromUtf8toAnsiW(name), mode.tempCStringW());
    }
    else version(Posix)
    {
        import core.sys.posix.stdio : fopen;
        return fopen(name.tempCString(), mode.tempCString());
    }
    else
    {
        return .fopen(name.tempCString(), mode.tempCString());
    }
}

With the given correction all works correctly.

Question.
Whether correctly such change from the point of view of programming canons on D ?

Reply via email to