Обнаружение кодировки Latin1 и UTF-8 - PullRequest
0 голосов
/ 28 мая 2020

Я получаю файлы в кодировке latin1 или utf8. Получаю как поток в C#. Как я могу определить, что это latin1 ("ISO-8859-1") или UTF-8? Когда я пытаюсь его обнаружить, он всегда определяет его как UTF-8. Этот код не работает, если всегда будет UTF-8.

     private Encoding GetUtf8EncodeStream(Stream fileStream)
            {    
     using var reader = new StreamReader(fileStream, true);
                    var encoding = reader.CurrentEncoding;
                    if (Equals(encoding, Encoding.UTF8))
                    {
                        return Encoding.UTF8;
                    }
                    return Encoding.GetEncoding("ISO-8859-1");
    }

void Method(){
 var encoding = GetUtf8EncodeStream(fileStream);
                    using (TextReader reader = new StreamReader(fileStream, encoding))
}

Сначала мне нужно узнать кодировку, а затем я прочту ее с этой кодировкой.

Мне нужно знать кодировку, потому что в ней есть специальные символы æ, ø и å. И если я попытаюсь прочитать поток, который имеет кодировку: latin1, и установил для средства чтения потока значение UTF-8, вместо символов будут стоять вопросительные знаки. И если я сделаю это в обратном порядке, где я установил StreamWriter для кодирования UTF-8, и его в latin1, черт возьми, проиграет;)

1 Ответ

0 голосов
/ 28 мая 2020

Я нашел решение. :) Этот сайт дал мне правильный ответ. https://archive.codeplex.com/?p=utf8checker

Он проверяет, является ли это допустимым UTF-8, а Latin1 - нет. И тогда мой код был прямолинейным.

    private Encoding GetUtf8EncodeStream(Stream fileStream)
        {
            if (_utf8Checker.IsUtf8(fileStream))
            {
                return Encoding.UTF8;
            }

            return Encoding.GetEncoding("ISO-8859-1");
        }

  var encoding = GetUtf8EncodeStream(stream);
            stream.Position = 0;
            using (TextReader reader = new StreamReader(stream, encoding))
...