символьный файловый поток в .NET - PullRequest
0 голосов
/ 18 декабря 2009

Мне нужно изменить текстовый файл с неизвестной кодировкой так, чтобы мне нужно было вставить текст после первого появления предопределенной строки (например, "# markx #"). Есть ли в .NET класс, который позволяет мне произвольно получать доступ к содержимому файла , но на основе символов (в отличие от байтов). Поскольку методы Stream.Seek работают на байтовой основе, мне не только нужно знать кодировку, но и знать, есть ли какие-то специальные байты управления (например, первые байты в начале файла Unicode). Я хотел бы иметь класс, который бы абстрагировал все это и позволил бы мне «сказать»: искать 25-й символ и добавлять туда некоторую строку , как это делал бы текстедитор.

Ответы [ 4 ]

4 голосов
/ 18 декабря 2009

Вы можете использовать StreamReader для прохождения по одному символу за раз - нет метода Seek, но вы все равно можете читать побайтово и, таким образом, эффективно реализовывать свой собственный поиск.

Что касается кодировок - вам нужно будет определить кодировку, чтобы использовать StreamReader.

Однако сам StreamReader может помочь, если вы создадите его с одной из перегрузок конструктора, которая позволяет указать флаг detectEncodingFromByteOrderMarks как истинный (или вы можете использовать Encoding.GetPreamble и посмотреть на преамбулу байта самостоятельно) ,

Оба эти метода помогут только автоматически определять кодировки на основе UTF - поэтому любые кодировки ANSI с указанной кодовой страницей, вероятно, не будут анализироваться правильно.

1 голос
/ 18 декабря 2009

Учитывая, что символы могут принимать переменное число байтов, это было бы довольно сложно сделать без преобразования байтов в символы с TextReader.

Вы можете обернуть TextReader и назначить ему метод Seek, который обеспечивает загрузку достаточного количества символов для удовлетворения каждого запроса.

0 голосов
/ 18 декабря 2009

Уровень абстракции над стандартным потоком «поиск» будет включать чтение каждого символа по очереди из файла (по умолчанию .net предполагает, что файлы имеют формат UTF-8), поэтому любой файл, который не начинается с BOM предполагает, что файл имеет формат UTF-8.

UTF-8 имеет символы переменного размера, поэтому вы не можете знать, сколько байтов занимает символ, пока не прочитаете этот байт.

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

В заключение, если вы знаете, что это файл AscII, UTF-16 или UTF-32, вы можете сделать это, потому что вы знаете размер каждого символа (насколько я знаю, если я ошибаюсь, пожалуйста, исправьте меня )

Если это UTF-8, вы не можете "искать" персонажа.

Надеюсь, это поможет,

0 голосов
/ 18 декабря 2009

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

Вы можете просмотреть все кодировки и попробовать их одну за другой или угадать кодировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...