Как читать ANSI-кодированный файл, содержащий специальные символы
Я пишу политику проверки TFS, которая проверяет, находятся ли наши исходные файлы, содержащие наш заголовок файла.
Моя проблема в том, что наш заголовок файла содержит специальный символ "©", и, к сожалению, некоторые из наших исходных файлов закодированы в ANSI.
Поэтому, если я прочитаю эти файлы в политике, строка будет выглядеть так: "Copyright 2009".
string content = File.ReadAllText(pendingChange.LocalItem);
Я устал менять кодировку строки, но это не помогает. Итак, как я могу прочитать эти файлы, я получаю правильную строку "Copyright © 2009"?
Спасибо за помощь!
С уважением Eny
Ответы
Ответ 1
Используйте Encoding.Default
:
string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default);
Однако вы должны знать, что это читает его с использованием системного кодирования по умолчанию - это может быть не то же самое, что кодировка файла. Нет единой кодировки, называемой ANSI, но обычно, когда люди говорят о "кодировке ANSI", они означают код Windows Code 1252 или что-то вроде того, что использует их ящик.
Ваш код будет более надежным, если вы сможете узнать точное кодирование.
Ответ 2
Казалось бы разумным, если у вас будет такая политика, что у вас также будет стандартная кодировка команды. Честно говоря, я не понимаю, почему любая команда будет использовать кодировку, отличную от "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
сделать что-то проще?