2009-12-07 3 views
2

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

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(); 

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

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

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

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

+1

Чтобы лучше понять все эти материалы кодирования, вы (или ваши клиенты) должны прочитать http://www.joelonsoftware.com/articles/Unicode.html – Oliver

+0

хорошую ссылку, хотя я нашел в ней ошибку. ;) –

ответ

7

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

+0

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

+1

Да, абсолютно. –

+1

Просто убедитесь, что люди, которые дали вам это требование, понимают, что означает «кодированный ASCII». Типичный человек, не знакомый с юникодом, может считать «ASCII закодированным» как «текстовый файл». –

1

Вы верны.

  • Pure US ASCII - это 7-битная кодировка с английскими буквами.
  • Вам нужна другая кодировка для захвата символов из других алфавитов. UTF-8 - хороший выбор.
1

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

В ASCII нет никакого способа получить все акценты; некоторые символы с акцентом (например, ü), однако, доступны в наборе символов «расширенный ASCII» (8 бит).

+0

Есть ли способ кодирования.Ascii с использованием 8-битной версии вместо 7 бит? – jim

+1

Всегда есть путь. Кодировка, которую вы, вероятно, хотите, это ANSI 1252 или Windows-1252, с помощью которой вы можете использовать Encoding.GetEncoding (1252). Это стандартная кодировка «Windows». – Aaronaught

2

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

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

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

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

+0

Спасибо, Guffa, GetEncoding интересен, просто не все равно рассказывают, что они используют на другом конце. – jim

4

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

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

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

Для поддержки символов не в Latin-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 является чем-то совершенно иным, он кодирует весь символ Unicode, установленный с помощью переменного числа байтов на символы, цифры и английские буквы кодируются так же, как ASCII (и Windows-1252), большинство других языков кодируются с 2 по 4 байта на символ.

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

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

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

+1

и, скорее всего, их интересует 1252-см. Http://www.cp1252.com для получения подробной информации об этой кодировке. –

1

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

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

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

Смежные вопросы