Как прочитать файл в кодировке ANSI, содержащий специальные символы - PullRequest
55 голосов
/ 16 сентября 2009

Я пишу политику регистрации TFS, которая проверяет, содержат ли наши исходные файлы наш заголовок файла.

Моя проблема в том, что заголовок нашего файла содержит специальный символ «©», и, к сожалению, некоторые из наших исходных файлов кодируются в ANSI. Поэтому, если я прочитаю эти файлы в политике, строка будет выглядеть так: «Copyright 2009».

string content = File.ReadAllText(pendingChange.LocalItem);

Мне надоело менять кодировку строки, но это не помогает. Так как же я могу прочитать эти файлы, чтобы получить правильную строку «Copyright © 2009»?

Спасибо за помощь!

С уважением, Эны

Ответы [ 2 ]

118 голосов
/ 16 сентября 2009

Использование Encoding.Default:

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default);

Вы должны знать, однако, что он читает его, используя системную кодировку по умолчанию - которая может не совпадать с кодировкой файла. Не существует единой кодировки, называемой ANSI, но обычно , когда люди говорят о «кодировке ANSI», они имеют в виду кодовую страницу Windows или что-то еще, что использует их бокс.

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

5 голосов
/ 16 сентября 2009

Было бы разумно, если бы у вас были такие политики, чтобы у вас также была согласованная командой стандартная кодировка. Честно говоря, я не понимаю, почему какая-либо команда использует кодировку, отличную от «Unicode (UtF-8 с подписью) - Codepage 65001» (за исключением, возможно, страниц ASPX со значительным нелатинским статическим контентом, но даже тогда я могу не понимаю, как было бы здорово использовать UTF-8).

Предполагая, что вы все еще хотите разрешить смешанные кодировки, вам понадобится способ определить, в какую кодировку был сохранен файл, чтобы вы знали, какую кодировку передать в ReadAllText. Это не легко определить из файла, однако использование Encoding.Default, вероятно, будет работать нормально. Поскольку, скорее всего, вам нужно иметь дело только с 2-мя кодировками, VS (UTF-8 с подписью) и общей кодировкой ANSI, используемой вашими машинами (вероятно, Windows-1252).

Следовательно, используя

 string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default);

будет работать. (Как я вижу, Джон уже написал). Это работает, потому что, когда в начале файла присутствует спецификация UTF-8 (то, что VS подразумевает под термином «подпись»), предоставленный параметр кодирования игнорируется, и в любом случае используется UTF-8. Следовательно, если файл сохраняется с использованием UTF-8, вы получите правильные результаты, а где используется ANSI, вы, скорее всего, также получите правильные результаты.

Кстати, если вы обрабатываете заголовки файлов, ReadAllLines ничего не облегчит?

...