C# Streamreader与外来字符

C# Streamreader与外来字符,c#,encoding,C#,Encoding,我应该使用哪种编码来读取æ、Ø、å、ä、ö、ü等?encoding.UTF8或encoding.Unicode StreamReader类的构造函数中有一个bool参数,允许它自动检测编码。Unicode=>UTF-8/UTF-16?:) 您应该使用原始数据的任何编码。你从哪里得到数据,你有关于它的编码的信息吗?如果你试图用错误的编码读取它,你会得到错误的答案:即使你的编码可以处理字符,它也会误解二进制数据 如果您选择了编码,那么UTF-8通常是一个不错的选择。如果你有很多远东的角色,就尺寸而言

我应该使用哪种编码来读取æ、Ø、å、ä、ö、ü等?

encoding.UTF8或encoding.Unicode


StreamReader类的构造函数中有一个bool参数,允许它自动检测编码。

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

您应该使用原始数据的任何编码。你从哪里得到数据,你有关于它的编码的信息吗?如果你试图用错误的编码读取它,你会得到错误的答案:即使你的编码可以处理字符,它也会误解二进制数据


如果您选择了编码,那么UTF-8通常是一个不错的选择。如果你有很多远东的角色,就尺寸而言是不好的,但在其他方面是好的。特别是,ASCII仍然是每个字符一个字节。

编码都归结为这样一个事实:如果一个字符使用8位,则只能处理256个不同的字符。鉴于英国和美国建立了这些惯例,256个标准ASCII字符大多是无重音的西文字符

这就是UTF8和UTF16发挥作用的地方。UTF8与ASCII非常相似——它对大多数西方字符使用一个字节。但是,有些特殊字节表示超出正常ASCII范围的字符-紧跟在特殊字节之后的两个字节表示真实字符

UTF16(也称为Unicode)去掉了特殊的指示符字节,每个字符只使用16位。我们都知道,16位给你65536个不同的字符,这还不足以覆盖世界上所有的书写字符,但它主要起作用

因此,为了回答您的问题:如果您的大多数字符都是非重音西文字符,UTF8将是您最简洁的表示形式(在许多编辑器中也是最可读的)。如果你的大部分字符不是西方的(比如说,中文),你可能会想使用Unicode(又名UTF16)


祝你好运

正如前面提到的所有其他答案一样,您需要使用正确的编码

问题是如何发现编码。这取决于文件的源:

  • 如果是XML文件,则在文件开头应有一条指定编码的
    处理指令。如果没有,你应该假设它是UTF8
  • 如果它是文本文件,您可以尝试UTF8编码,或者如果失败,您应该尝试正在运行的计算机的系统区域设置。如果失败了,你就只能靠自己了,除非你认识的人能告诉你创建文件的机器的系统语言环境

  • 在任何情况下,通过使用UTF8并返回UTF16,您应该能够覆盖大约90%的所有文件。过去五年中,几乎所有程序或语言都支持Unicode。但是,如果您打算使用大量来自中国的文件,您可能会首先尝试UTF16,它在编码方面更为流行。

    没有完全可靠的方法,但您可以使用一些启发式方法来猜测编码

  • 寻找一个新的答案
  • 如果找不到BOM表,则假定该文件为UTF-8,并尝试对其进行解析。如果是XML文件,则声明可能包含编码。类似地,HTML文件可能包含元编码标记
  • 如果上述所有操作都失败,则假设它是UTF-8(或ANSI——您的选择)

  • 通过BOM表检测编码。它有点过时了——System.Text.Encoding现在有一个GetPreamble方法,StreamReader有一个重载,它将尝试为您检测编码。

    您还可以将区域性放在像çá等奇怪的carachteres中读取

    CultureInfo pt = CultureInfo.GetCultureInfo("pt-BR");
    StreamReader fileReader = new StreamReader("C:\temp\test.txt",Encoding.GetEncoding(pt.TextInfo.ANSICodePage),true);
    

    你用了8秒就错过了:)不一定。这取决于输入编码。如果你想保存一个没有BOM表的Unicode文件,那么这就是你的问题:)那么你认为StreamReader做什么?你就是那个开始谈论输入的人……我不知道你在说什么;)OP想要从流中读取数据,正如Jon和其他人所说,您需要知道输入字符串的编码。使用UTF8只是一个很好的猜测,但可能是错误的。如何读取文件的编码?该程序将使用来自许多地方的许多文件。Thanks@Scott:你不能,可靠地。文件不包含其编码。你需要知道。例如,每个文件都是有效的Windows-1252文件,但如果它是“真的”UTF-8,则结果将非常不同。@Jon:Unicode文件假定包含一个BOM(字节顺序标记),该BOM(和StreamReader)可用于检测编码。@leppie:没有“假定”的意思-它们可能包含BOM,但它们肯定不必包含BOM。这仍然可能导致编码错误——它仍然可能是一个Windows-1252文件,恰好以UTF-16或UTF-8 BOM的字节开头。换句话说,你不能可靠地做到这一点。除了UTF-8之外,其他所有产品都需要BOM。从我从从事企业对企业消息传递系统的人员那里听说,unicode编码还没有你所说的那么普遍。完全检测和修复其他系统错误解码等黑客行为在业内很常见。