C# ASCII编码和Umlauts和重音符号

C# ASCII编码和Umlauts和重音符号,c#,ascii,C#,Ascii,我需要用ASCII编码生成文本文件。我有一个数据库,里面有希腊语、法语和德语字符,还有元音和口音。这可能吗 string reportString = report.makeReport(); Dictionary<string, string> replaceCharacters = new Dictionary<string, string>(); byte[] encodedReport = Encoding.ASCII.GetBytes(reportString)

我需要用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();
string reportString=report.makeReport();
字典替换字符=新字典();
字节[]encodedReport=Encoding.ASCII.GetBytes(报告字符串);
Response.BufferOutput=false;
Response.ContentType=“text/plain”;
AddHeader(“内容处置”、“附件;文件名=“+reportName+”.txt”);
Response.OutputStream.Write(encodedReport,0,encodedReport.Length);
Response.End();
当我取回reportString时,字符被忠实地表示出来。当我保存我的文本文件时?代替特殊字符

据我所知,ASCII标准仅适用于美式英语,而UTF 8则适用于国际观众。这是正确的吗

我要声明,如果要求是ASCII编码,我们就不能正确表示重音和元音


或者,我是不是在做/说一些愚蠢的事情?

你不能在ASCII编码的文件中表示重音和元音,因为这些字符没有在标准中定义。

你是正确的

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

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

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

没有办法在ASCII中获得您想要的所有口音;但是,在“扩展ASCII”(8位)字符集中可以使用一些重音字符(如u)。

ASCII字符集仅包含大写和小写的A-Z、数字和一些标点符号。没有希腊字符,没有元音,没有口音

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

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


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

在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完全不同,它通过使用每个字符的可变字节数对整个Unicode字符集进行编码,数字和英文字母的编码与ASCII(和Windows-1252)相同。大多数其他语言的编码为每个字符2到4个字节

UTF-8主要与ASCII系统兼容,因为英语编码与ASCII相同,并且字符串中没有嵌入空值

.net字符串(UTF-16LE)和其他编码之间的转换由System.Text.encoding类完成


重要提示:最重要的是,接收端的系统将使用相同的代码页和发送端的系统-否则您将得到乱码。

其他答案中提到的各种编码可以粗略地描述为

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


像“如果需求是ASCII编码,我们就不能正确地表示重音和元音”这样的说法对非技术用户来说可能听起来很迂腐。另一种方法是获取他们想要的样本(可能是他们电脑的ANSI或OEM代码页),确定适当的代码页,并指定该代码页。

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

Ä=Ae
ä=ae
ö=oe
Ö=Oe
ü=ue
Ü=Ue
ß=sz
编辑: Andyraddaz已经编写了用ASCII表示替换大量Unicode字符的代码。对于某些语言/文化,它们可能不正确,但至少不会有编码错误。

对。所以,如果我说我不能给你你的特殊字符,因为我有一个要求,我必须生产这些报告ASCII编码,我是在做一个真实的陈述。只要确保给你这个要求的人理解“ASCII编码”的真正含义。一个典型的非Unicode知识的人可能会把“ASCII编码”看作“文本文件”。谢谢Lasse,我认为我的UMLUTUT和重音打破了他们的导入过程,所以我几乎可以肯定的是,平均ASCII,而不是其他任何东西都有编码的方式。ASCII使用8位版本而不是7位。总是有一种方式。您可能需要的编码是ANSI 1252或Windows-1252,您可以使用encoding.GetEncoding(1252)获得这些编码。这是标准的“Windows”编码。感谢Guffa,GetEncoding很有趣,只是无法告诉他们在另一端使用了什么。为了更好地了解所有这些编码内容,你(或你的客户)应该阅读好的参考资料,尽管我确实发现了一个错误。;)很可能是