ASCII编码和变音符号和重音符号

时间:2009-12-07 13:45:31

标签: c# ascii

我要求使用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编码,我们就不能正确表示重音符号和变音符号。

或者,我是否会离开并做一些蠢事?

7 个答案:

答案 0 :(得分:7)

您无法在ASCII编码文件中表示重音符号和变音符号,因为这些字符未在标准ASCII charset中定义。

答案 1 :(得分: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类完成。

重要提示:最重要的是接收端的系统将在发送端使用相同的代码页和系统 - 否则你会得到胡言乱语。

答案 2 :(得分:2)

ASCII字符集只包含大写和小写的A-Z,数字和一些标点符号。没有希腊字符,没有变音符号,没有重音符号。

您可以使用该组中的字符集,有时也称为“扩展ASCII”,它使用256个字符而不是128个字符。

使用与ASCII不同的字符集的问题是您必须使用正确的字符集,即接收部分期望的字符集,否则将无法正确解释任何扩展字符。

您可以使用Encoding.GetEncoding(...)创建扩展编码。有关可能的编码列表,请参阅Encoding class的参考。

答案 3 :(得分:1)

你是对的。

  • US ASCII是一种7位编码,仅包含英文字符。
  • 您需要使用不同的编码来捕获其他字母表中的字符。 UTF-8是一个不错的选择。

答案 4 :(得分:1)

UTF-8向后兼容ASCII,因此如果您将文件编码为UTF-8,则ASCII客户端可以读取其字符集中的任何内容,Unicode客户端可以读取所有扩展字符。

无法在ASCII中获得所需的所有重音;但是,“扩展ASCII”(8位)字符集中提供了一些重音字符(如ü)。

答案 5 :(得分:1)

其他答案中提到的各种编码可以宽泛地描述为extended ASCII

当您的用户要求ASCII编码时,他们可能会要求其中一种。

像“如果要求是ASCII编码我们不能正确表示重音符号和变音符号”这样的声明可能会让非技术用户听起来很迂腐。另一种方法是获取他们想要的样本(可能是他们PC的ANSI或OEM代码页),确定适当的代码页,并指定它。

答案 6 :(得分:1)

以上内容仅部分正确。确实不能用ASCII编码这些字符,但是可以表示它们。之所以存在它们,是因为某些打字机和早期的计算机无法处理这些字符。

Ä=Ae
ä=ae
ö=oe
Ö=Oe
ü=ue
Ü=Ue
ß=sz

编辑: Andyraddaz已经编写了用ASCII表示形式替换许多Unicode字符的代码。对于某些语言/文化,它们可能不正确,但是至少您不会遇到编码错误。 https://gist.github.com/andyraddatz/e6a396fb91856174d4e3f1bf2e10951c