Синтаксический разбор - PullRequest
       9

Синтаксический разбор

1 голос
/ 26 ноября 2009

Я уверен, что это что-то очень простое, что я облажался, но здесь идет:

Я пытаюсь проанализировать файл журнала, который обычно отформатирован в UNICODE (и я свободно признаю, что я вообще мало что знаю о UNICODE, но первые два байта файла - 0xFFFE, и есть ноль между всеми остальными символами). Особенность в том, что этот файл заканчивается строкой с байтовой последовательностью 0x0D000D0A, то есть \ r \ 0 \ r \ n, и это, очевидно, сбивает меня с толку TextReader при чтении.

То есть каждая вторая строка, которую я печатаю, заполнена:

?????????????????? ???????????? ?      ?????????  ? ?????????????  ? ?????????????? ???? ??? ????? ???????????????????? ??? ???????????? ????????????????? ?????????????????????? ???????????????????? ?????? ????????????????????? ????????????? ?????

Каков рекомендуемый для меня способ анализа этого с помощью C #? Вернее, что я делаю не так?

Спасибо!

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

FileStream fsa = File.Open(@"C:\InboxLOG.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
TextReader sr = new StreamReader(fsa, Encoding.Unicode, true);
string line = "";
while ((line = sr.ReadLine()) != null)
{              
     Console.WriteLine(line);
}

Использование StreamReader(fsa) дает те же результаты.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2009

Хммм ... 0x0D000D0A?

Твои окончания строки действительно выглядят растоптанными. Возможно, вам придется проанализировать его более вручную через поток ... Я бы ожидал 0x0D000A000? (так как это little-endian). Интересно, если процесс не в Юникоде выполнил цикл "заменить lf на crlf" и испортил его? Конечно, вы можете сделать то же самое, и (обработка байтов в блоках по два) заменить 0D0A на 0A00 (начиная только с четных байтов). Но начинать с не поврежденных данных всегда лучше ...


был

0xFFFE - это спецификация, поэтому все, что включает StreamReader и т. Д. (Например, File.OpenText), должно обрабатывать это автоматически и выбирать правильную кодировку. Если нет, дайте ему подсказку:

using(var reader = new StreamReader(path, Encoding.Unicode)) {
    ...
}
2 голосов
/ 26 ноября 2009

Пожалуйста, попробуйте это

StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Unicode, true);

Похоже на кодировку UTF16, 0xFFFE - знак порядка байтов

http://en.wikipedia.org/wiki/Byte_order_mark

1 голос
/ 26 ноября 2009

Я предполагаю, что вы на самом деле используете StreamReader, так как TextReader - абстрактный класс.

Из вашего описания вы текст в UTF-16, но StreamReader по умолчанию UTF-8. Когда вы создаете свой StreamReader, вы должны указать ему использовать вместо него UTF-16:

new StreamReader(..., System.Text.Encoding.Unicode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...