C# :Символы плохо отображаются в Консоли, почему?

StackOverflow https://stackoverflow.com/questions/215030

Вопрос

Картинка ниже объясняет все:

альтернативный текст http://img133.imageshack.us/img133/4206/accentar9.png

Переменная TextInput берется из File.ReadAllText(path); и такие персонажи , как :' é è ...не отображать.Когда я запускаю свой UnitTest, все в порядке!Я вижу их...Почему?

Это было полезно?

Решение 3

Я не знаю, почему это работает с NUnit, но я открываю файл с помощью NotePad ++ и вижу ANSI в формате.Теперь я преобразовал в UTF-8, и это работает.

Мне все еще интересно, почему это работало с NUnit, а не в консоли?но, по крайней мере, сейчас это работает.

Обновить Я не понимаю, почему я проголосовал за вопрос и за этот ответ, потому что вопрос по-прежнему хорош, почему в консоли я не могу прочитать файл ANSI, но в NUnit я могу?

Другие советы

.NET-классы ( System.IO.StreamReader и т.п.) принимают кодировку UTF-8 в качестве кодировки по умолчанию. Если вы хотите прочитать другую кодировку, вы должны явно передать это соответствующей перегрузке конструктора.

Также обратите внимание, что нет ни одной кодировки с именем & # 8220; ANSI & # 8221 ;. Вы, вероятно, ссылаетесь на кодовую страницу Windows 1252 или западноевропейскую. Обратите внимание, что это отличается от кодировки Windows по умолчанию в других странах. Это актуально, когда вы пытаетесь использовать System.Text.Encoding.Default , потому что это на самом деле отличается от системы к системе.

/ РЕДАКТИРОВАТЬ: кажется, вы неправильно поняли и мой ответ и мой комментарий:

<Ол>
  • Проблема в вашем коде заключается в том, что вам нужно сообщить .NET, какую кодировку вы используете.
  • Другое замечание о том, что & # 8220; ANSI & # 8221; может ссылаться на разные кодировки, не имеющие отношения к вашей проблеме. Это было просто & # 8220; между прочим & # 8221; замечание для предотвращения недоразумений (ну, что одно сработало).
  • Итак, наконец: решение вашей проблемы должно быть следующим кодом:

    string text = System.IO.File.ReadAllText("path", Encoding.GetEncoding(1252));
    

    Важной частью здесь является использование соответствующего экземпляра System.Text.Encoding .

    Однако это предполагает, что ваша кодировка действительно соответствует Windows-1252 (но я полагаю, что Notepad ++ имеет в виду & # 8220; ANSI & # 8221;). Я понятия не имею, почему ваш текст отображается правильно при чтении NUnit. Я полагаю, что NUnit либо имеет какое-то автоматическое обнаружение для кодировок текста, либо NUnit использует некоторые странные настройки по умолчанию (т.е. не UTF-8).

    Да, и кстати: & # 8220; ANSI & # 8221; действительно относится к & # 8220; Американскому национальному институту стандартов & # 8221 ;. Существует множество совершенно разных стандартов, которые имеют & # 8220; ANSI & # 8221; как часть их имен. Например, C ++ является (среди прочих) также стандартом ANSI.

    Только в некоторых случаях (неточно) оно используется для обозначения кодировок Windows. Но даже там, как я пытался объяснить, обычно это относится не к определенной кодировке, а скорее к классу кодировок, который Windows использует по умолчанию для разных стран. Одним из них является Windows-1252.

    Попробуйте настроить выходную кодовую страницу вашей консоли sessin, используя chcp команда. Кодовые страницы, поддерживаемые окнами: здесь , здесь и здесь . Помните, что фонетная консоль довольно проста: она отображает символы UNCICODE или DBCS с помощью кодовой страницы для определения глифа, который будет отображаться.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top