С# Справка по чтению иностранных символов с помощью StreamReader
Я использую приведенный ниже код, чтобы прочитать текстовый файл, содержащий иностранные символы, файл закодирован ANSI и отлично выглядит в блокноте. Код ниже не работает, когда значения файла считываются и отображаются в datagrid, символы отображаются как квадраты, может быть другая проблема в другом месте?
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?
Ответы
Ответ 1
Да, это может быть с фактической кодировкой файла, возможно, с unicode. Попробуйте UTF-8, поскольку это наиболее распространенная форма кодировки в юникоде. В противном случае, если файл ASCII, то стандартная кодировка ASCII должна работать.
Ответ 2
Вы также можете попробовать кодировку по умолчанию, которая использует текущую кодовую страницу ANSI системы.
StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true)
Когда вы пытаетесь использовать меню "Сохранить как" в Notepad с исходным файлом, посмотрите на поле со списком кодировки. Он скажет вам, какой кодируемый блокнот догадывается файлом.
Кроме того, если это файл ANSI, параметр detectEncodingFromByteOrderMarks, вероятно, не поможет.
Ответ 3
У меня была та же проблема, и мое решение было простым: вместо
Encoding.ASCII
использование
Encoding.GetEncoding("iso-8859-1")
Ответ был найден здесь.
Изменить: больше решений. Это может быть более точным:
Encoding.GetEncoding(1252);
Кроме того, в некоторых случаях это будет работать и для вас, если ваша кодировка по умолчанию для ОС соответствует кодировке файла:
Encoding.Default;
Ответ 4
Использование Encoding.Unicode не будет точно декодировать ANSI файл так же, как JPEG-декодер не поймет GIF файл.
Я удивлен, что Encoding.Default
не работал для файла ANSI, если он действительно был ANSI - если вы когда-либо узнали, какую именно блок-страницу Блокнота используете, вы можете использовать Encoding.GetEncoding(int)
.
В общем, по возможности я бы рекомендовал использовать UTF-8.
Ответ 5
Попробуйте использовать другую кодировку, такую как Encoding.UTF8. Вы также можете попробовать позволить StreamReader найти кодировку:
StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true)
Изменить: просто увидел ваше обновление. Попробуйте позволить StreamReader делать гадания.
Ответ 6
File.OpenText() всегда использует UTF-8 StreamReader неявно. Создайте собственный StreamReader
вместо этого укажите нужную кодировку.
как
using (StreamReader reader = new StreamReader(@"C:\test.txt", Encoding.Default)
{
// ...
}
Ответ 7
Я решил проблему чтения португальских символов, изменив исходный файл на блокноте ++.
![enter image description here]()
С#
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();
}
Ответ 8
для арабского языка, я использовал Encoding.GetEncoding(1256)
. он работает хорошо.
Ответ 9
Для шведского языка Å Ö единственное решение от вышеупомянутых рабочих было:
Encoding.GetEncoding("iso-8859-1")
Надеюсь, это сэкономит кому-то время.
Ответ 10
Я также читаю экспортированный файл, который содержит французский и немецкий языки. Я использовал Encoding.GetEncoding("iso-8859-1"), правда, который работал без каких-либо проблем.