StreamWriter编码。默认使用不同的编码吗?

时间:2018-09-26 09:17:53

标签: c# encoding stream

我正在尝试将文件导出到无法识别Unicode的旧程序(我的所有数据库都使用 utf8_unicode_ci 编码)。

导出文件时,然后使用Encoding.Default。

using (StreamWriter sw = new StreamWriter(parcours + "2", false, Encoding.Default))
   {
      foreach (string st in output)
      {
         sw.WriteLine("{0}", st);
      }
   }

但是奇怪的是,在某些情况下可以正确读取文件,而在其他情况下却不能,但是我使用的功能完全相同。

当我使用Notepad ++打开时,我可以看到文件在 ANSI 中,而不能工作的文件在 Macintosh 中。

如何始终导出ANSI?我想使用默认值可以使其自身更改编码?

nota:Here据说记事本中的“ ANSI”仅表示它不是unicode,所以我不知道我是否可以信任记事本的信息?

编辑:根据CodeCaster的建议,我使用了 Windows-1251编码,现在回到了初始位置,但至少我知道编码是错误的出处。是吗?

老实说,我不明白,在调试模式下,列表中的所有文本都是正确的。但是在某些情况下,代码已正确编码,在某些情况下则没有。 具体来说,这就是我所说的“作品”:

ДВУТАВР20К2被写成ДВУТАВР20К2文件(有效)。

Двутавр12б1被写成ƒ¬”“ ј¬–12Ѕ1”文件(无效)。

在字符串中,没有我所知道的编码,所以我怎么解释呢?

2 个答案:

答案 0 :(得分:2)

  

当我使用Notepad ++打开时,可以看到该文件在ANSI中工作,而一个不工作在Macintosh中。

如果您使用的是Google,则会find that Notepad++'s encoding/code page auto detection isn't flawless

如果您要使用ANSI代码页(由于要为其编写文件的程序不理解Unicode)来编写西里尔字符(假定您在配置文件中给出的位置,则假定为西里尔字符),您想要的代码页是Code Page 1251 Windows Cyrillic (Slavic)。要获得从该代码页在代码点中写入字符的编码,请使用Encoding.GetEncoding()

using (StreamWriter sw = new StreamWriter(..., Encoding.GetEncoding("windows-1251")))
{
}

这是假定读取文件的程序也使用该代码页。这是非Unicode文本文件的问题,文件的编写者和阅读者必须就编码达成共识。因此,最终,您应该找出消费应用程序期望哪种特定编码。我只是在这里假设它实际上是Windows-1251。

答案 1 :(得分:0)

从观看.NET Encoding code

Calling Encoding.Default要求操作系统提供其Windows嵌入式编码,很可能是UTF-8。该页面建议您尽可能使用UTF-8或UTF-16(很可能是第一个)。如果您想阅读更多内容,请尝试this post