У меня много байтовых массивов; каждая строка. Как найти кодировку, которую вы используете?

У меня есть приложение, которое считывает двоичные данные из базы данных. Каждый полученный массив байтов представляет собой строку. Строки, однако, все взяты из разных кодировок (чаще всего ASCII, UTF-8 BOM и UTF-16 LE, но есть и другие). В моем собственном приложении я пытаюсь преобразовать массив байтов в строку, но кодировка, которая использовалась для перехода от строки к байтам, не сохраняется с байтами. Возможно ли в С# определить или вывести кодировку, используемую из массива байтов?

Вариант использования упрощается ниже. Предположим, что байтовый массив всегда является строкой. Также предположим, что строка может использовать любую кодировку.

byte[] bytes = Convert.FromBase64(stringAsBytesAsBase64);
string originalString = Encoding.???.GetString(bytes);
-1
источник поделиться
2 ответа

Для текста, который является XML, спецификация XML предоставляет требования и способы определения кодировки.

В отсутствие информации внешнего кодирования (например, заголовки MIME) анализируемые объекты, которые хранятся в кодировке, отличной от UTF-8 или UTF-16, должны начинаться с текстового объявления (см. 4.3.1 "Декларация текста"), содержащего кодировку объявление:

...

В отсутствие информации, предоставляемой внешним транспортным протоколом (например, HTTP или MIME), это фатальная ошибка для объекта, включающего объявление кодирования, которое должно быть представлено процессору XML в кодировке, отличной от указанной в объявлении, или для объект, который начинается ни с отметки байтового заказа, ни с объявлением кодирования для использования кодировки, отличной от UTF-8. - https://www.w3.org/TR/xml/#charencoding

Похоже, что дизайн хранилища должен был отбросить любую "информацию, предоставленную внешним транспортным протоколом". Возможно, что то, что было сохранено, соответствует спецификации. Вы можете проверить свои данные.

Если данные завершены, просто позвольте вашей обработке XML выполнить задание:

byte[] bytes = Convert.FromBase64(stringAsBytesAsBase64);
using (var stream = new MemoryStream(bytes))
{
    var doc = XDocument.Load(stream);
}

Если вам понадобится XML в виде текста с известной кодировкой, вы можете сериализовать его, используя нужную кодировку.

0
источник

Кто-то остановил это. Возможно, потому, что он не начинал с четкого ответа:

Возможно ли в С# определить или вывести кодировку, используемую из массива байтов?

Нет.

Ниже вы можете сделать все возможное, и вы поймете, почему это проблематично:

Вы можете начать со списка известных Encodings.GetEncodings() и устранить возможности. В итоге у вас будет много известных возможностей, многие известные возможности и потенциально неизвестные возможности (для кодировок, которые не поддерживаются в.NET, если таковые имеются). Это все так же сложно.

Затем вы можете применить эвристику или некоторое знание ожидаемого контента, чтобы сузить список дальше. И если результаты применения каждого из оставшихся кодировок одинаковы, то вы наверняка получили правильный текст, даже если вы не определили исходную кодировку.

-1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос