C # Помощь в чтении иностранных символов с помощью StreamReader - PullRequest
56 голосов
/ 27 февраля 2009

Я использую код ниже, чтобы прочитать текстовый файл, который содержит иностранные символы, файл закодирован 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?

Ответы [ 9 ]

119 голосов
/ 27 февраля 2009

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

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

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

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

23 голосов
/ 27 февраля 2009

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

21 голосов
/ 07 февраля 2013

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

Encoding.ASCII

использование

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

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

Редактировать: больше решений. Это может быть более точным:

Encoding.GetEncoding(1252);

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

Encoding.Default;
9 голосов
/ 27 февраля 2009

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

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

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

7 голосов
/ 27 февраля 2009

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

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

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

3 голосов
/ 17 апреля 2012

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

using (StreamReader reader =  new StreamReader(@"C:\test.txt", Encoding.Default)
 {
 // ...
 }
0 голосов
/ 12 июня 2019

Для шведских Å Ä ... единственное решение от вышеупомянутых рабочих было:

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

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

0 голосов
/ 29 ноября 2016

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

0 голосов
/ 16 января 2015

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

enter image description here

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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...