Как прочитать 1С файл через StreamReader при 2-х вариантах кодировки
Дан 1С тектсовый файл в виде Stream-а У файла может быть 2 ваианта кодировки - Windows-1251 и UTF-8
Как понять с какой кодировкой создвавать StreamReader? Если у меня файл с кодировкой UTF8, а задаю кодировку Windows-1251, то строки с кириллицей читаются неверно (кракозябры)
Ответы (3 шт):
Прювет Волку
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
должен хорошо работать.
Одинесные текстовые файлы начинаются с одного и того же слова. Прочитайте первый байт одной из строк. Если d0,d1 или bom (в первой) - то юникод.
Файл клиент банка начинается с
1CClientBankExchange
ВерсияФормата=1.03
Кодировка=Windows
Отправитель=Управление торговлей, редакция 11
Получатель=
и в обратную сторону
1CClientBankExchange
ВерсияФормата=1.03
Кодировка=Windows
Отправитель=Система интернет банк
Получатель=
Хотя можно проверить на значение параметра в третьей строке.
Решение такое:
- Задал массив байтов, которое на UTF-8 означают слово "Кодировка" (это обзязательный праметр 1С файла, з строка)
- Считываю первые 300 байт (значение можно подобрать эмпирически) из stream-а
- Проверяю - если ли вхождение массива из п. 1 в массив в п.2
- Если есть - то кодировка - UTF-8
- Если нет - задаю массив байтов, которое на Windows-1251 означают слово "Кодировка"
- Проверяю - если ли вхождение массива из п. 5 в массив в п.2
- Если есть, то кодировка - Windows-1251
Проверять на вхождение "1CClientBankExchange" НЕТ смысла, так как в обеих кодировках выглядит одинаково. Проверочное слово должно быть на кириллице.