Как прочитать файл в кодировке ANSI, содержащий специальные символы

StackOverflow https://stackoverflow.com/questions/1432064

  •  07-07-2019
  •  | 
  •  

Вопрос

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

Моя проблема в том, что заголовок нашего файла содержит специальный символ " & # 169; " и, к сожалению, некоторые из наших исходных файлов кодируются в ANSI. Поэтому, если я прочитаю эти файлы в политике, строка будет выглядеть следующим образом " Copyright & # 65533; 2009 & Quot;.

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

Я устал менять кодировку строки, но это не помогает. Как я могу прочитать эти файлы, чтобы получить правильную строку " Авторское право & # 169; 2009 & Quot;?

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

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

Это было полезно?

Решение

Используйте Encoding.Default :

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

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

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

Другие советы

Было бы разумно, если бы у вас были такие политики, чтобы у вас также была согласованная командами стандартная кодировка. Честно говоря, я не понимаю, почему какая-либо команда использует кодировку, отличную от «Unicode» (UtF-8 с подписью) - кодовая страница 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 не облегчит ситуацию?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top