From 217083155365616a0bb5d7f5f9cc6151b3d90819 Mon Sep 17 00:00:00 2001 From: Luciano Ciccariello Date: Sun, 18 Aug 2019 23:23:01 +0100 Subject: [PATCH] Add some characters to International CTD encoder --- .../Internals/InternationalCtdEncoder.cs | 12 +++++++ OpenKh.Tests/Bbs/CtdEncodingTests.cs | 34 ++++++++++++++----- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/OpenKh.Bbs/Messages/Internals/InternationalCtdEncoder.cs b/OpenKh.Bbs/Messages/Internals/InternationalCtdEncoder.cs index f4ec09683..36b15e55f 100644 --- a/OpenKh.Bbs/Messages/Internals/InternationalCtdEncoder.cs +++ b/OpenKh.Bbs/Messages/Internals/InternationalCtdEncoder.cs @@ -9,6 +9,8 @@ internal class InternationalCtdEncoder : ICtdMessageEncoder { private static readonly string _mapping0 = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}~"; + private static readonly string _mapping99 = + "ÀÁÂÄÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖŒÙÚÛÜßàáâäæçèéêëìíîïñòóôõöùúûüœ¿¡"; private static readonly Dictionary _inverseMapping = _mapping0 .Select((x, i) => new { Ch = x, Data = i + 0x20 }) @@ -43,9 +45,19 @@ private static char GetCharacter(byte[] data, ref int index) { var ch = data[index++]; + if (ch >= 0x00 && ch < 0x20) + return (char)ch; + if (ch >= 0x20 && ch < 0x80) return _mapping0[ch - 0x20]; + var ch2 = data[index++]; + switch (ch) + { + case 0x99: + return _mapping99[ch2 - 0x80]; + } + throw new Exception($"Data {ch:X02} cannot be decoded."); } } diff --git a/OpenKh.Tests/Bbs/CtdEncodingTests.cs b/OpenKh.Tests/Bbs/CtdEncodingTests.cs index 37831bd65..6fb0e4dba 100644 --- a/OpenKh.Tests/Bbs/CtdEncodingTests.cs +++ b/OpenKh.Tests/Bbs/CtdEncodingTests.cs @@ -11,25 +11,41 @@ public class CtdEncodingTests [Theory] [InlineData(' ', 0x20)] [InlineData('A', 0x41)] - public void InternationalEncodingTest(char ch, byte expected, byte? expected2 = null) + [InlineData('~', 0x7e)] + public void InternationalEncodingSimpleTest(char ch, byte expected) { var actual = euEnc.Encode($"{ch}"); Assert.Equal(expected, actual[0]); - if (expected2.HasValue) - Assert.Equal(expected2, actual[1]); + } + + [Theory] + [InlineData('Ò', 0x99, 0x8f)] + [InlineData('ç', 0x99, 0x9f)] + [InlineData('ú', 0x99, 0xaf)] + public void InternationalEncodingExtTest(char ch, byte expected, byte expected2) + { + var actual = euEnc.Encode($"{ch}"); + Assert.Equal(expected, actual[0]); + Assert.Equal(expected2, actual[1]); } [Theory] [InlineData(' ', 0x20)] [InlineData('A', 0x41)] - public void InternationalDecodingTest(char expected, byte ch, byte? ch2 = null) + [InlineData('~', 0x7e)] + public void InternationalDecodingSimpleTest(char expected, byte ch) { - string actual; - if (ch2.HasValue) - actual = euDec.Decode(new byte[] { ch, ch2.Value }); - else - actual = euDec.Decode(new byte[] { ch }); + string actual = euDec.Decode(new byte[] { ch }); + Assert.Equal(expected, actual[0]); + } + [Theory] + [InlineData('Ò', 0x99, 0x8f)] + [InlineData('ç', 0x99, 0x9f)] + [InlineData('ú', 0x99, 0xaf)] + public void InternationalDecodingExtTest(char expected, byte ch, byte ch2) + { + string actual = euDec.Decode(new byte[] { ch, ch2 }); Assert.Equal(expected, actual[0]); } }