diff --git a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs index 931b78918f..c17a440c99 100644 --- a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs +++ b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs @@ -51,6 +51,9 @@ internal sealed class WindowsVTInputHelper : IDisposable [DllImport ("kernel32.dll")] private static extern uint GetConsoleCP (); + [DllImport ("kernel32.dll", SetLastError = true)] + private static extern bool SetConsoleCP (uint wCodePageID); + #endregion private const int ERROR_NOT_FOUND = 1168; @@ -68,6 +71,22 @@ internal sealed class WindowsVTInputHelper : IDisposable private uint _originalConsoleMode; private bool _disposed; + private const uint CP_UTF8 = 65001; + + private readonly uint _originalConsoleCP; + + public WindowsVTInputHelper () + { + _originalConsoleCP = GetConsoleCP (); + + if (_originalConsoleCP == CP_UTF8 || SetConsoleCP (CP_UTF8)) + { + return; + } + int error = Marshal.GetLastWin32Error (); + Logging.Warning ($"{nameof (WindowsVTInputHelper)}: Failed to set console input code page to UTF-8. Win32 error: {error}"); + } + /// /// Gets whether VTS input mode was successfully enabled. /// @@ -238,6 +257,7 @@ public void Restore () try { + SetConsoleCP (_originalConsoleCP); SetConsoleMode (InputHandle, _originalConsoleMode); IsEnabled = false; }