Streamreader和外国字符

时间:2009-02-26 16:19:30

标签: c# encoding

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

7 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:8)

此外,你可以把文化读成像çááá等奇怪的carachteres。

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

答案 2 :(得分:4)

您需要使用正确的编码,因为提到了所有其他答案。

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

  1. 如果是XML文件,则在文件开头应该有一个<?xml>处理指令来指定编码。如果没有,你应该假设它是UTF8。
  2. 如果是文本文件,则可以尝试UTF8编码,如果失败,则应尝试运行的计算机的系统区域设置。如果失败了,除非你知道有人可以告诉你创建文件的机器的系统区域设置,否则你几乎都是自己的。
  3. 在任何情况下,您都应该能够通过使用UTF8并回退到UTF16来覆盖所有文件的大约90%。过去五年中,几乎所有程序或语言都支持Unicode。但是,如果您要从中国消耗大量文件,您可以先尝试使用UTF16,这对编码GB18030来说更为普遍。

答案 3 :(得分:3)

编码都归结为这样一个事实:如果你为一个字符使用8位,你只能处理256个不同的字符。看到英国和美国设置了这些惯例,256个标准ASCII字符大多是非重音的西方字符。

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

UTF16(也称为Unicode)取消了特殊指示符字节,每个字符只使用16位。众所周知,16位给你65536个不同的字符,这不足以涵盖所有世界上的书写字符,但它主要完成这项工作。

所以回答你的问题:如果你的大部分字符都是非重音的西方字符,UTF8将是你最紧凑的代表(在许多编辑器中最具可读性)。如果您的大部分字符都是非西方字符(例如中文),您可能想要使用Unicode(又名UTF16)。

祝你好运!

答案 4 :(得分:1)

Encoding.UTF8或Encoding.Unicode。

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

答案 5 :(得分:1)

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

  1. 寻找byte order mark
  2. 如果您没有找到BOM,请假设该文件为UTF-8并尝试解析它。如果它是XML文件,则声明可能包含编码。同样,HTML文件可能包含元编码标记。
  3. 如果未能完成上述所有操作,请假设它是UTF-8(或ANSI - 您的选择)。
  4. Rick Strahl has a handy article通过BOM检测编码。它有点过时了 - System.Text.Encoding现在有一个GetPreamble方法,StreamReader有一个重载,它将尝试为你检测编码。

答案 6 :(得分:0)

Unicode =&gt; UTF-8 / UTF-16? :)