Прочитать файл с символами Юникода - PullRequest
12 голосов
/ 27 апреля 2011

У меня есть страница asp.net c #, и я пытаюсь прочитать файл со следующим символом 'и преобразовать его в'. (От наклонного апострофа к апострофу).

FileInfo fileinfo = new FileInfo(FileLocation);
string content = File.ReadAllText(fileinfo.FullName);

//strip out bad characters
content = content.Replace("’", "'");

Это не работает, и это превращает наклонные апострофы в? знаки.

Ответы [ 4 ]

15 голосов
/ 27 апреля 2011

Подозреваю, что проблема не в замене, а в чтении самого файла. Когда я попробовал это по-своему (используя Word и copy-paste), я получил те же результаты, что и вы, однако изучение content показало, что .Net Framework считает, что этот символ был символом Unicode 65533, т.е. WTF?» символ перед заменой строки. Вы можете проверить это самостоятельно, изучив соответствующий символ в отладчике Visual Studio, где должен отображаться код символа:

content[0]; // 65533 '�'

Причина, по которой замена не работает, проста - content не содержит строку, которую вы ей дали:

content.IndexOf("’"); // -1

Что касается того, почему чтение файла не работает должным образом - вы, вероятно, используете неправильную кодировку при чтении файла. (Если кодировка не указана, то .Net Framework попытается определить правильную кодировку для вас, однако не существует 100% надежного способа сделать это, и очень часто она может ошибиться). Точная кодировка, которая вам нужна, зависит от самого файла, однако в моем случае использовалась кодировка Extended ASCII , поэтому для чтения файла мне просто нужно было указать правильную кодировку:

string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding("iso-8859-1"));

(см. этот вопрос ).

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

content = content.Replace("\u0092", "'");
2 голосов
/ 26 мая 2011

Моя ставка - файл закодирован в Windows-1252 . Это почти то же самое, что и ISO 8859-1. Разница в том, что Windows-1252 использует «отображаемые символы, а не управляющие символы в диапазоне от 0x80 до 0x9F». (Здесь находится наклонный апостроф. То есть 0x92)

//Specify Windows-1252 here
string content = File.ReadAllText(fileinfo.FullName, Encoding.GetEncoding(1252));
//Your replace code will then work as is
content = content.Replace("’", "'");
2 голосов
/ 27 апреля 2011
// This should replace smart single quotes with a straight single quote

Regex.Replace(content, @"(\u2018|\u2019)", "'");

//However the better approach seems to be to read the page with the proper encoding and leave the quotes alone
var sreader= new StreamReader(fileInfo.Create(), Encoding.GetEncoding(1252));
0 голосов
/ 27 апреля 2011

Если вы используете String (с заглавной буквы), а не string, он должен быть в состоянии обработать любой Unicode, который вы на него набрасываете.Попробуйте сначала и посмотрите, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...