Как Джон Скит объяснил в своем ответе , строка представляется закодированной в UTF-16, а не в UTF-8.
Вы также написали
Кроме того, он добавляет недопустимый символ в начало преобразованной строки.
Этот недопустимый символ почти наверняка является знак порядка байтов , небольшая предварительная последовательность байтов, которая указывает конкретное кодирование, используемое в потоке.Учитывая его наличие, вы можете настроить StreamReader
для обнаружения указанной кодировки с помощью конструктора new StreamReader(Stream, true)
:
public static string Base64Decode(string base64EncodedData)
{
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
using (var reader = new StreamReader(new MemoryStream(base64EncodedBytes), true))
{
return reader.ReadToEnd();
}
}
Обратите внимание, что StreamReader
будет использовать порядок байтовпометить во время обработки, чтобы он не был включен в возвращаемую строку.
В качестве альтернативы, поскольку ваши данные base64 на самом деле являются XML, а XML содержит собственное объявление кодировки , вы можете извлечь массив байтов ипроанализируйте его напрямую, используя XmlReader
:
public static XmlReader CreateXmlReaderFromBase64(string base64EncodedData, XmlReaderSettings settings = null)
{
var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
return XmlReader.Create(new MemoryStream(base64EncodedBytes), settings);
}
В соответствии с документами , XmlReader.Create(Stream)
будет определять кодировку по мере необходимости:
Сканирование XmlReaderпервые байты потока ищут метку порядка байтов или другой знак кодирования.Когда кодирование определено, кодирование используется для продолжения чтения потока, и обработка продолжает анализировать входные данные как поток символов (Unicode).