Streamreader и иностранные символы - PullRequest
2 голосов
/ 26 февраля 2009

Какую кодировку следует использовать для чтения read, Ø, å, ä, ö, ü и т. Д.?

Ответы [ 7 ]

9 голосов
/ 26 февраля 2009

Вы должны использовать любую кодировку исходных данных. Откуда вы получаете данные, и есть ли у вас информация о том, в какой кодировке они находятся? Если вы попытаетесь прочитать его с неправильной кодировкой, вы получите неправильный ответ: даже если ваша кодировка может обрабатывать символы, она будет неправильно интерпретировать двоичные данные.

Если вы наберете , выберите кодировку, тогда UTF-8 обычно является хорошей ставкой. Это плохо с точки зрения размера, если у вас много дальневосточных персонажей, но в остальном хорошо. В частности, ASCII по-прежнему выходит по одному байту на символ.

8 голосов
/ 11 сентября 2010

Также вы можете поместить культуру для чтения странных символов, таких как ç á á и т. Д.

CultureInfo pt = CultureInfo.GetCultureInfo("pt-BR");
StreamReader fileReader = new StreamReader("C:\temp\test.txt",Encoding.GetEncoding(pt.TextInfo.ANSICodePage),true);
4 голосов
/ 26 февраля 2009

Вам нужно использовать правильную кодировку, как и все другие упомянутые ответы.

Проблема в том, как найти кодировку. Это зависит от источника вашего файла:

  1. Если это файл XML, в начале файла должна быть инструкция обработки <?xml>, которая задает кодировку. Если его нет, вы должны предположить, что это UTF8.
  2. Если это текстовый файл, вы можете попробовать кодировку UTF8, или, если это не удастся, вы должны попробовать системный язык компьютера, на котором вы работаете. Если это не помогает, вы в значительной степени сами по себе, если только вы не знаете кого-то, кто может сказать вам системный язык компьютера, на котором был создан файл.

В любом случае вы должны быть в состоянии покрыть около 90% всех файлов, используя UTF8 с запасным вариантом до UTF16. Почти все программы или языки за последние пять лет поддерживают Unicode. Однако, если вы собираетесь использовать много файлов из Китая, вы можете сначала попробовать UTF16, который немного более распространен для кодирования GB18030 .

3 голосов
/ 26 февраля 2009

Все кодировки сводятся к тому, что если вы используете 8 битов для символа, вы можете обрабатывать только 256 различных символов. С учетом того, что Великобритания и США создали соглашения, 256 стандартных символов ASCII - это, в основном, западные символы без акцента.

Вот где в игру вступают UTF8 и UTF16. UTF8 очень похож на ASCII - он использует один байт для большинства западных символов. Однако есть некоторые специальные байты, которые указывают символ вне нормального диапазона ASCII - два байта, которые следуют непосредственно за специальным байтом, затем указывают на истинный символ.

UTF16 (также известный как Unicode) избавляется от специального байта индикатора и просто использует 16 бит для каждого символа. Как мы все знаем, 16 битов дают вам 65536 различных символов, что недостаточно для охвата всех письменных символов мира, но в основном это работает.

Итак, чтобы ответить на ваш вопрос: если большинство ваших символов - западные символы без акцента, UTF8 будет для вас наиболее компактным представлением (и наиболее читаемым во многих редакторах). Если большинство ваших персонажей не западные (скажем, китайские), вы, вероятно, захотите использовать Unicode (он же UTF16).

Удачи!

1 голос
/ 26 февраля 2009

Не существует абсолютно надежного метода, но вы можете использовать некоторые эвристические методы, чтобы угадать кодировку.

  1. Ищите метку порядка байтов .
  2. Если вы не нашли спецификацию, предположите, что это файл UTF-8, и попробуйте проанализировать его. Если это файл XML, объявление может содержать кодировку. Аналогично, HTML-файл может содержать метатегированный тег.
  3. Если все вышеперечисленное не выполнено, предположим, что это UTF-8 (или ANSI - ваш выбор).

У Рика Страля есть удобная статья об обнаружении кодировок с помощью спецификации. Это немного устарело - System.Text.Encoding теперь имеет метод GetPreamble, а StreamReader имеет перегрузку, которая попытается определить кодировку для вас.

1 голос
/ 26 февраля 2009

Encoding.UTF8 или Encoding.Unicode.

Класс StreamReader имеет в своем конструкторе параметр bool, позволяющий ему автоматически определять кодировку.

0 голосов
/ 26 февраля 2009

Unicode => UTF-8 / UTF-16? :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...