@@ -30,14 +30,30 @@ #import "OFApplication.h" #import "OFOutOfRangeException.h" #import "OFReadFailedException.h" #import "OFWriteFailedException.h" + +#ifdef OF_WINDOWS +# include +#endif OFStdIOStream *of_stdin = nil; OFStdIOStream *of_stdout = nil; OFStdIOStream *of_stderr = nil; + +#ifdef OF_WINDOWS +UINT originalConsoleCP; +UINT originalConsoleOutputCP; + +static void +restoreCodepage(void) +{ + SetConsoleCP(originalConsoleCP); + SetConsoleOutputCP(originalConsoleOutputCP); +} +#endif @interface OFStdIOStream () - (instancetype)OF_initWithFileDescriptor: (int)fd; @end @@ -69,10 +85,22 @@ { of_stdin = [[OFStdIOStream alloc] OF_initWithFileDescriptor: 0]; of_stdout = [[OFStdIOStream alloc] OF_initWithFileDescriptor: 1]; of_stderr = [[OFStdIOStream alloc] OF_initWithFileDescriptor: 2]; } + +#ifdef OF_WINDOWS ++ (void)initialize +{ + originalConsoleCP = GetConsoleCP(); + originalConsoleOutputCP = GetConsoleOutputCP(); + atexit(restoreCodepage); + + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); +} +#endif - init { OF_INVALID_INIT_METHOD }