C #: символы не отображаются хорошо, когда в консоли, почему? - PullRequest
3 голосов
/ 18 октября 2008

Изображение ниже объясняет все:

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

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

Ответы [ 3 ]

3 голосов
/ 18 октября 2008

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

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

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

  1. Проблема в вашем коде заключается в том, что вам нужно сообщить .NET, какую кодировку вы используете.
  2. Другое замечание о том, что «ANSI» может относиться к различным кодировкам, не имеет никакого отношения к вашей проблеме. Это было просто «кстати» замечание, чтобы предотвратить недоразумения (ну, у этого получилось обратное).

Итак, наконец: Решением вашей проблемы должен быть следующий код:

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

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

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

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

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

1 голос
/ 18 октября 2008

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

0 голосов
/ 18 октября 2008

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

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

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

...