diff --git a/Terminal.Gui/Core/ConsoleDriver.cs b/Terminal.Gui/Core/ConsoleDriver.cs index 873d8398b..cd180af1c 100644 --- a/Terminal.Gui/Core/ConsoleDriver.cs +++ b/Terminal.Gui/Core/ConsoleDriver.cs @@ -681,11 +681,13 @@ namespace Terminal.Gui { /// Column to move the cursor to. /// Row to move the cursor to. public abstract void Move (int col, int row); + /// /// Adds the specified rune to the display at the current cursor position /// /// Rune to add. public abstract void AddRune (Rune rune); + /// /// Ensures a Rune is not a control character and can be displayed by translating characters below 0x20 /// to equivalent, printable, Unicode chars. @@ -694,21 +696,14 @@ namespace Terminal.Gui { /// public static Rune MakePrintable (Rune c) { - var controlChars = gethexaformat (c, 4); - if (controlChars <= 0x1F || (controlChars >= 0X7F && controlChars <= 0x9F)) { + var controlChars = c & 0xFFFF; + if (controlChars <= 0x1F || controlChars >= 0X7F && controlChars <= 0x9F) { // ASCII (C0) control characters. // C1 control characters (https://www.aivosto.com/articles/control-characters.html#c1) return new Rune (controlChars + 0x2400); - } else { - return c; } - } - static uint gethexaformat (uint rune, int length) - { - var hex = rune.ToString ($"x{length}"); - var hexstr = hex.Substring (hex.Length - length, length); - return (uint)int.Parse (hexstr, System.Globalization.NumberStyles.HexNumber); + return c; } /// diff --git a/UnitTests/ConsoleDriverTests.cs b/UnitTests/ConsoleDriverTests.cs index cb4bc1dcf..e9688c638 100644 --- a/UnitTests/ConsoleDriverTests.cs +++ b/UnitTests/ConsoleDriverTests.cs @@ -608,5 +608,29 @@ namespace Terminal.Gui.ConsoleDrivers { Application.Run (win); Application.Shutdown (); } + + [Theory] + [InlineData(0x0000001F, 0x241F)] + [InlineData(0x0000007F, 0x247F)] + [InlineData(0x0000009F, 0x249F)] + [InlineData(0x0001001A, 0x241A)] + public void MakePrintable_Converts_Control_Chars_To_Proper_Unicode (uint code, uint expected) + { + var actual = ConsoleDriver.MakePrintable(code); + + Assert.Equal (expected, actual.Value); + } + + [Theory] + [InlineData(0x20)] + [InlineData(0x7E)] + [InlineData(0xA0)] + [InlineData(0x010020)] + public void MakePrintable_Does_Not_Convert_Ansi_Chars_To_Unicode (uint code) + { + var actual = ConsoleDriver.MakePrintable(code); + + Assert.Equal (code, actual.Value); + } } }