C# Помощь в чтении посторонних символов с помощью StreamReader

Я использую приведенный ниже код для чтения текстового файла, содержащего иностранные символы, файл имеет кодировку ANSI и отлично смотрится в блокноте. Приведенный ниже код не работает, когда значения файлов считываются и отображаются в сетке данных, символы отображаются в виде квадратов, может ли быть другая проблема в другом месте?

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.ANSI);
using (reader = File.OpenText(inputFilePath))

Спасибо

Обновление 1 : я пробовал все кодировки, найденные в System.Text.Encoding . и все не могут правильно показать файл.

Обновление 2 : я изменил кодировку файла (пересохранил файл) на Unicode и использовал, System.Text.Encoding.Unicode и он работал нормально. Так почему же Блокнот правильно его прочитал? А почему не System.Text.Encoding.Unicode читал файл ANSI?

Ответов (10)

Решение

Да, это может быть фактическая кодировка файла, возможно, Unicode. Попробуйте UTF-8, поскольку это наиболее распространенная форма кодировки Unicode. В противном случае, если файл ASCII, тогда должна работать стандартная кодировка ASCII.

Использование Encoding.Unicode не может точно декодировать файл ANSI так же, как декодер JPEG не распознает файл GIF.

Я удивлен, что Encoding.Default это не сработало для файла ANSI, если это действительно был ANSI - если вы когда-нибудь узнаете, какую именно кодовую страницу использовал Блокнот, вы могли бы использовать Encoding.GetEncoding(int).

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

File.OpenText () всегда неявно использует UTF-8 StreamReader. Вместо этого создайте собственный экземпляр StreamReader и укажите желаемую кодировку. нравиться

using (StreamReader reader =  new StreamReader(@"C:\test.txt", Encoding.Default)
 {
 // ...
 }

для арабского я использовал Encoding.GetEncoding(1256) . он работает хорошо.

Я решил свою проблему чтения португальских символов, изменив исходный файл на блокноте ++.

введите описание изображения здесь

C#

    var url = System.Web.HttpContext.Current.Server.MapPath(@"~/Content/data.json");
    string s = string.Empty;
    using (System.IO.StreamReader sr = new System.IO.StreamReader(url, System.Text.Encoding.UTF8,true))
    {
          s = sr.ReadToEnd();
    }

У меня была такая же проблема, и мое решение было простым: вместо

Encoding.ASCII

использовать

Encoding.GetEncoding("iso-8859-1")

Ответ был найден здесь .

Изменить: больше решений. Возможно, это более точный вариант:

Encoding.GetEncoding(1252);

Кроме того, в некоторых случаях это сработает и для вас, если кодировка по умолчанию в вашей ОС совпадает с кодировкой файла:

Encoding.Default;

Для шведского Å Ä Ö единственным решением из приведенных выше работ было:

Encoding.GetEncoding("iso-8859-1")

Надеюсь, это сэкономит время.

Я также читаю экспортированный файл, содержащий французский и немецкий языки. Я использовал Encoding.GetEncoding ("iso-8859-1"), правда, который работал без каких-либо проблем.

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

StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true)

Когда вы пытаетесь использовать меню Блокнота «Сохранить как» с исходным файлом, посмотрите на поле со списком кодировки. Он сообщит вам, какая кодировка, по предположениям блокнота, используется файлом.

Кроме того, если это файл ANSI, параметр detectEncodingFromByteOrderMarks, вероятно, не поможет.

Попробуйте другую кодировку, например Encoding.UTF8. Вы также можете попробовать позволить StreamReader найти саму кодировку:

    StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true)

Изменить: только что увидел ваше обновление. Попробуйте позволить StreamReader угадывать.