Кодировка ASCII, умлауты и ударения - PullRequest
2 голосов
/ 07 декабря 2009

У меня есть требование к созданию текстовых файлов с кодировкой ASCII. У меня есть база данных, полная греческих, французских и немецких символов с умлаутами и ударениями. Это вообще возможно?

string reportString = report.makeReport();
Dictionary<string, string> replaceCharacters = new Dictionary<string, string>();
byte[] encodedReport = Encoding.ASCII.GetBytes(reportString);
Response.BufferOutput = false;
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".txt");
Response.OutputStream.Write(encodedReport, 0, encodedReport.Length);
Response.End();

Когда я возвращаю reportString, символы представляются достоверно. Когда я сохраняю текстовый файл, который у меня есть? вместо специальных символов.

Насколько я понимаю, стандарт ASCII предназначен только для американского английского языка, а UTF 8 - для международной аудитории. Это правильно?

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

Или я ухожу и говорю / говорю что-то глупое?

Ответы [ 6 ]

7 голосов
/ 07 декабря 2009

Вы не можете представлять акценты и умляуты в кодированном ASCII-файле просто потому, что эти символы не определены в стандартном ASCII-кодировке .

4 голосов
/ 07 декабря 2009

До Unicode это обрабатывалось «кодовыми страницами», вы можете думать о кодовой странице как о сопоставлении между символами Unicode и 256 значениями, которые могут помещаться в один байт (очевидно, в каждой кодовой странице большинство символов Unicode отсутствуют).

Исходная кодовая страница ASCII включает только английские буквы - но вряд ли кто-то действительно захочет получить исходную 7-битную кодовую страницу, они, вероятно, вызовут любой 8-битный набор символов ASCII.

Английская кодовая страница, известная как Latin-1, называется ISO-8859-1 или Windows-1252 (первая - это стандарт ISO, вторая - самая близкая кодовая страница, поддерживаемая Windows).

Для поддержки символов не на латинице-1 вам необходимо кодировать, используя разные кодовые страницы, например:

874 — Thai
932 — Japanese
936 — Chinese (simplified) (PRC, Singapore)
949 — Korean
950 — Chinese (traditional) (Taiwan, Hong Kong)
1250 — Latin (Central European languages)
1251 — Cyrillic
1252 — Latin (Western European languages)
1253 — Greek
1254 — Turkish
1255 — Hebrew
1256 — Arabic
1257 — Latin (Baltic languages)
1258 — Vietnamese

UTF-8 - это нечто совершенно иное, он кодирует весь набор символов Юникода, используя переменное число байтов на символы, цифры и английские буквы кодируются так же, как ASCII (и Windows-1252), большинство других языков кодируются как 2 до 4 байтов на символ.

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

Преобразование между строками .net (UTF-16LE) и другими кодировками выполняется классом System.Text.Encoding.

ВАЖНОЕ ПРИМЕЧАНИЕ: самое главное, что система на принимающей стороне будет использовать ту же кодовую страницу и систему на стороне отправителя - в противном случае вы получите бред.

2 голосов
/ 07 декабря 2009

Набор символов ASCII содержит только буквы A-Z в верхнем и нижнем регистре, цифры и некоторые знаки препинания. Без греческих символов, без умлаутов, без акцентов.

Вы можете использовать набор символов из группы, которую иногда называют «расширенный ASCII», который использует 256 символов вместо 128.

Проблема с использованием набора символов, отличного от ASCII, заключается в том, что вы должны использовать правильный набор символов, то есть тот, который ожидает принимающая часть, или он не сможет правильно интерпретировать какие-либо из расширенных символов.

Вы можете использовать Encoding.GetEncoding(...) для создания расширенной кодировки. См. Ссылку на Класс кодирования для получения списка возможных кодировок.

1 голос
/ 07 декабря 2009

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

Когда ваши пользователи запрашивают кодировку ASCII, они, вероятно, запрашивают одну из них.

Выражение типа «если требованием является кодировка ASCII, мы не можем правильно отобразить акценты и умлауты», может показаться педантичным для нетехнического пользователя. Альтернативный вариант - получить образец того, что они хотят (возможно, кодовую страницу ANSI или OEM своего ПК), определить соответствующую кодовую страницу и указать ее.

1 голос
/ 07 декабря 2009

UTF-8 обратно совместим с ASCII, поэтому, если вы кодируете свои файлы как UTF-8, клиенты ASCII могут читать все, что находится в их наборе символов, а клиенты Unicode могут читать все расширенные символы.

Нет способа получить все акценты, которые вы хотите в ASCII; однако некоторые акцентированные символы (например, ü) доступны в 8-битном наборе расширенных символов ASCII.

1 голос
/ 07 декабря 2009

Вы правы.

  • Pure US ASCII - это 7-битная кодировка, содержащая только английские символы.
  • Вам нужна другая кодировка для захвата символов из других алфавитов. UTF-8 - хороший выбор.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...