Обнаружение специальных символов в 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 перед угадыванием. Существует также связанные так вопрос