Обнаружение специальных символов в c#

Я работаю на проекте C#, в котором некоторые данные содержат символы, которые не распознаются кодировки. Они отображаются следующим образом:

"Некоторый текст � со специальными символами � в нем".

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

if(myString.Contains("�"))
{
   //Do stuff
}

в то время как он работает, не совсем правильно использовать странный символ непосредственно в функции Contains. Разве нет более чистого способа сделать это ?

EDIT:

после проверки с командой, ответственной за чтение файлов, вот как они это делают:

var sr = new StreamReader(filePath, true);
var content = sr.ReadToEnd();

передает true в качестве второго параметра StreamReader предполагается обнаружить кодировку из спецификации файла и использовать ее для чтения содержимого. Это не всегда работа, хотя, поскольку некоторые файлы не несут эту информацию, следовательно, почему их данные читаются неправильно.

мы сделали несколько тестов и с помощью StreamReader(filePath, Encoding.Default) вместо этого, похоже, работает для большинства, если не для всех файлов, с которыми у нас были проблемы. Ожидается, что файлы, которые работали раньше, больше не работают, потому что они не используют кодировку по умолчанию.

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

проблема остается той же: как мы проверяем, после попытки обнаружить кодировку файла, если данные были прочитаны неправильно ?

2 ответов


символ � не является специальным символом. Это символ замены Юникода. Это означает, что код пытался преобразовать текст ASCII, используя неправильную кодовую страницу. Любые символы, которые не совпадали в кодовой странице, были заменены на �.

решение состоит в том, чтобы прочитать файл, используя правильную кодировку. Кодировка по умолчанию, используемая File методы или StreamReader в utf8. Вы можете передать другую кодировку, используя соответствующий конструктор, например StreamReader(Stream, Encoding, Boolean). Использование системы кодировка локали, вам нужно использовать кодировка.По умолчанию :

var sr = new StreamReader(filePath,Encoding.Default);    

можно использовать StreamReader (Поток, Кодирование, Логическое) конструктор для автоматического определения кодировок Unicode из спецификации и резервного копирования в другую кодировку.

предполагая, что файлы являются каким-либо типом Unicode или соответствуют вашей системной локали, вы можете использовать:

var sr = new StreamReader(filePath,Encoding.Default, true);

из StreamReader источник показывает, что метод DetectEncoding будет проверять первые байты файла для определения кодировки. Если он найден, он используется вместо предоставленной кодировки. Операция не вызывает дополнительного ввода-вывода, потому что метод проверяет внутренний буфер класса


редактировать

Я только что понял, что вы не можете загрузить raw-файл в строку .NET и по-прежнему иметь полную информацию об исходном файле.

на здесь использует api Mlang, который лучше работает, не загружая файл в строку .NET перед угадыванием. Существует также связанные так вопрос