Как прочитать 1С файл через StreamReader при 2-х вариантах кодировки

Дан 1С тектсовый файл в виде Stream-а У файла может быть 2 ваианта кодировки - Windows-1251 и UTF-8

Как понять с какой кодировкой создвавать StreamReader? Если у меня файл с кодировкой UTF8, а задаю кодировку Windows-1251, то строки с кириллицей читаются неверно (кракозябры)


Ответы (3 шт):

Автор решения: rotabor

Прювет Волку

UTF8:

d0 9f d1 80 d1 8e d0 b2 d0 b5 d1 82 20 d0 92 d0 be d0 bb d0 ba d1 83

Windows1251:

cf f0 fe e2 e5 f2 20 c2 ee eb ea f3

В UTF8 видим байты d0 и d1. Utf8.IsValid должен хорошо работать.

→ Ссылка
Автор решения: eri

Одинесные текстовые файлы начинаются с одного и того же слова. Прочитайте первый байт одной из строк. Если d0,d1 или bom (в первой) - то юникод.

Файл клиент банка начинается с

1CClientBankExchange
ВерсияФормата=1.03
Кодировка=Windows
Отправитель=Управление торговлей, редакция 11
Получатель=

и в обратную сторону

1CClientBankExchange
ВерсияФормата=1.03
Кодировка=Windows
Отправитель=Система интернет банк
Получатель=

Хотя можно проверить на значение параметра в третьей строке.

→ Ссылка
Автор решения: Дмитрий

Решение такое:

  1. Задал массив байтов, которое на UTF-8 означают слово "Кодировка" (это обзязательный праметр 1С файла, з строка)
  2. Считываю первые 300 байт (значение можно подобрать эмпирически) из stream-а
  3. Проверяю - если ли вхождение массива из п. 1 в массив в п.2
  4. Если есть - то кодировка - UTF-8
  5. Если нет - задаю массив байтов, которое на Windows-1251 означают слово "Кодировка"
  6. Проверяю - если ли вхождение массива из п. 5 в массив в п.2
  7. Если есть, то кодировка - Windows-1251

Проверять на вхождение "1CClientBankExchange" НЕТ смысла, так как в обеих кодировках выглядит одинаково. Проверочное слово должно быть на кириллице.

→ Ссылка