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




регулярные выражения c# (2)

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

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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

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

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


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

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

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

Вы можете использовать конструктор StreamReader (Stream, Encoding, Boolean) для автоматического определения кодировок Unicode из спецификации и резервного копирования на другую кодировку.

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

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

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


РЕДАКТИРОВАТЬ

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

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





character-encoding