Файловый поток добавляет нежелательные символы во время чтения - PullRequest
2 голосов
/ 13 ноября 2010

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

Ниже кода.

using (var _fs = File.Open(_idFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
     byte[] b = new byte[_fs.Length];
     UTF8Encoding temp = new UTF8Encoding(true);
     while (_fs.Read(b, 0, b.Length) > 0)
     {
         Console.WriteLine(temp.GetString(b));
         Console.WriteLine(ASCIIEncoding.ASCII.GetString(b));


     }
 }

например: мои данные в текстовом файле просто "образец". Но приведенный выше код возвращает

  "?sample" and
  "???sample"

В чем причина ?? это начало файла индикатора? есть ли способ прочитать только мое реальное содержание ??

Ответы [ 4 ]

2 голосов
/ 13 ноября 2010

Метка порядка байтов (BOM) состоит из символа Unicode 0xFEFF и используется для маркировки файла с использованием кодировки, используемой для него.

Так что, если вы правильно расшифруете файл как UTF8, вы получите этот символ в качестве первого символа вашей строки. Если вы неправильно декодируете его как ANSI, вы получаете 3 символа, поскольку кодировка UTF8 0xFEFF - это последовательность байтов "EF BB BF", которая составляет 3 байта.

Но весь ваш код можно заменить на

File.ReadAllText(fileName,Encoding.UTF8)

и это должно удалить спецификацию тоже. Или вы пропускаете параметр кодирования и позволяете функции автоматически определять кодировку (для которой она использует спецификацию)

2 голосов
/ 13 ноября 2010

Может быть спецификацией, обозначающей порядок байтов.

0 голосов
/ 13 ноября 2010

Попробуйте вместо

using (StreamReader sr = new StreamReader(File.Open(path),Encoding.UTF8))

Это определенно лишит вас спецификации

0 голосов
/ 13 ноября 2010

Вы читаете спецификацию из потока. Если вы читаете текст , попробуйте использовать StreamReader, который будет обрабатывать это автоматически.

...