Декодировать строку с HEX коды символов в UTF-8 символы


Из системы мы получаем сообщения, содержащие коды, которые представляют символы UTF-8.

Например :

var str="Test =64 =C2=AE =E1=A6=92 test";

Чтобы расшифровать эти коды в UTF-8 я добавил простую функцию, которая делает 3 замены регулярного выражения:

protected static string ReplaceHexCodesInString(string input)
{

    var output = input;
    var encoding = Encoding.UTF8;

    var regTripleHex = new Regex("=(E[0-9A-F])=([0-9A-F]{2})=([0-9A-F]{2})");
    output = regTripleHex.Replace(output, m => encoding.GetString(new[]{
            byte.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber),
            byte.Parse(m.Groups[2].Value, System.Globalization.NumberStyles.HexNumber),
            byte.Parse(m.Groups[3].Value, System.Globalization.NumberStyles.HexNumber)
        }));

    var regDoubleHex = new Regex("=([C-D][0-9A-F])=([0-9A-F]{2})");

    output = regDoubleHex.Replace(output, m => encoding.GetString(new[]{
            byte.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber),
            byte.Parse(m.Groups[2].Value, System.Globalization.NumberStyles.HexNumber)
        }));

    var regRemainingHex = new Regex("=([0-9A-F]{2})");

    output = regRemainingHex.Replace(output, m => encoding.GetString(new[]{
            byte.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)
        }));

    return output;
}

Это, кажется, работает, как ожидалось, что в настоящее время в этих сообщениях.
Обратите внимание, что сообщения не содержат 4-разрядных символов UTF-8 (Ф.е. 0xf0 в системе 0x90 0x8c 0xb8 = ????)

Но это может быть упрощена?
Возможно, есть уже стандартная функция?

Я искал, но не нашел хорошего стандартные встроенные функции C#, что уже делает этот тип преобразования.

Ну, кроме примера, который использует функции из System.Net.Mail.
Но это, кажется, очень подвержен ошибкам и требует очень специфический формат.

var input = "bl=61=C2=B0"; 
var output = System.Net.Mail.Attachment.CreateAttachmentFromString("", "=?utf-8?Q?" + input.Trim() +"?=").Name;


1302
3
задан 5 февраля 2018 в 04:02 Источник Поделиться
Комментарии
1 ответ

Вы готовы использовать % вместо =?

Если так Uri.UnescapeDataString должна быть достаточной. если вы не всегда можете Replace("=", "%") и использовать UnescapeDataString в любом случае.

Uri.UnescapeDataString("Test =64 =C2=AE =E1=A6=92 test".Replace("=", "%"))
//Test d ® ᦒ test

2
ответ дан 5 февраля 2018 в 04:02 Источник Поделиться