Ответ 1
Я подозреваю, что проблема связана не с заменой, а с чтением самого файла. Когда я попробовал это сделать (используя Word и copy-paste), я оказался с теми же результатами, что и вы, однако, изучая content
, показал, что структура .Net считает, что символ был символом Unicode 65533
, то есть "WTF?" символ перед заменой строки. Вы можете проверить это самостоятельно, изучив соответствующий символ в отладчике Visual Studio, где он должен показать код символа:
content[0]; // 65533 '�'
Причина, по которой замена не работает, проста - content
не содержит строку, которую вы ей дали:
content.IndexOf("’"); // -1
Что касается того, почему чтение файла не работает должным образом - вы, вероятно, используете неправильную кодировку при чтении файла. (Если кодировка не указана, инфраструктура .Net будет пытаться определить правильную кодировку для вас, однако нет 100% надежного способа сделать это, и поэтому часто она может ошибиться). Точная кодировка, которая вам нужна, зависит от самого файла, однако в моем случае используемая кодировка была Extended ASCII, и поэтому для чтения файла я просто нужно указать правильную кодировку:
string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding("iso-8859-1"));
(См. этот вопрос).
Вам также необходимо убедиться, что вы указываете правильный символ в своей заменяющей строке - при использовании "нечетных" символов в коде вам может быть более надежно указывать символ по его коду символов, а не как строковый литерал ( что может вызвать проблемы при изменении кодировки исходного файла), например, для меня работало следующее:
content = content.Replace("\u0092", "'");