.NET: StreamReader не распознает символы ° - PullRequest
2 голосов
/ 11 февраля 2011

Я пытаюсь запустить RegEx, чтобы найти символы степени (градусы \ u00B0 | \ u00BA в дополнение к поиску другой формы '-> \ u00B4).Я читаю координаты DMS широты и долготы, например: 12º30'23.256547 "S

Проблема в том, как я читаю файл, поскольку я могу вручную вставить строку, подобную приведенной ниже (формат - широта,долгота, описание):

const string myTestString = @ "12º30'23.256547" "S, 12º30'23.256547" "W, Somewhere";

и мое регулярное выражение соответствует ожидаемому - я могутакже посмотрите значения º, где, когда я использую потоковый ридер, я вижу � для всех нераспознанных символов (символ º включен как один из этих нераспознанных символов)

Я пробовал:

            var sr = new StreamReader(dlg.File.OpenRead(), Encoding.UTF8);
            var sr = new StreamReader(dlg.File.OpenRead(), Encoding.Unicode);
            var sr = new StreamReader(dlg.File.OpenRead(), Encoding.BigEndianUnicode);

в дополнение к стандартному ASCII.

В любом случае, когда я читаю файл, я получаю эти специальные символы. Любой совет будет принят с благодарностью !!

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Вы пробовали различные кодировки ... но, вероятно, не правильный один.Вы не должны просто догадываться о кодировках - узнайте, какую кодировку они действительно используют, и используйте это.StreamReader само по себе абсолютно нормально.Он может работать с любой кодировкой, которую вы ему даете, но он должен соответствовать кодировке, используемой при записи файла.

Откуда этот файл?Что это записало?

Если оно было записано с помощью Блокнота, оно вполне может использовать Encoding.Default, которое является кодировкой по умолчанию для системы (то есть она будет варьироваться от машины к машине).Если это вообще возможно, измените все, что создает файл, для использования единой стандартной кодировки - лично я большой поклонник UTF-8.

1 голос
/ 11 февраля 2011

Вам необходимо определить, в какой кодировке был сохранен файл, и использовать его при чтении с помощью потокового ридера.

Если он создан с использованием обычного текстового редактора, я предполагаю, что кодировкой по умолчанию является Windows-1252 или ISO-8859-1.

Символ степени равен 0xBA в ISO-8859-1 и выходит за пределы 7-битной таблицы ASCII.Я не знаю, как Encoding.ASCII интерпретирует это.

В противном случае может быть проще просто сохранить файл как UTF-8, если у вас есть такая возможность.

Причина, по которой он работает при определении строки в коде, заключается в том, что.NET всегда будет работать со строками с внутренней кодировкой (UCS-2?), Поэтому StreamReader конвертирует считываемые им байты из файла во внутреннюю кодировку, используя кодировку, указанную при создании StreamReader.

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