【问题标题】:StreamWriter Encoding.Default uses different encodings?StreamWriter Encoding.Default 使用不同的编码?
【发布时间】:2019-03-02 00:32:11
【问题描述】:

我正在尝试将文件导出到无法识别 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);
      }
   }

但奇怪的是,在某些情况下文件被正确读取,而在其他情况下则没有,但我使用完全相同的功能。

当我用记事本++打开时,我可以看到正在运行的文件在ANSI中,而不能运行的文件在Macintosh中。

如何始终导出 ANSI?我猜使用默认值会使其自行更改编码?

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

编辑:正如 CodeCaster 建议的那样,我使用了 Windows-1251 编码,我又回到了初始点,但至少我知道编码是错误所在是吗?

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

ДВУТАВР20К2 在文件中写成 ДВУТАВР20К2(它可以工作)。

Двутавр12б1 在文件中写为 ƒ¬""ј¬–12Ѕ1(不起作用)。

在字符串中,据我所知没有编码,那我该如何解释呢?

【问题讨论】:

  • 您是否尝试过阅读docs,尤其是大红色警告块,并指定显式编码?您正在编写文件以供识别的程序是哪个编码和代码页?你想写哪种字符,我猜西里尔字母给了你的位置?然后选择适当的代码页。
  • 如果您可能可以,我强烈建议您在任何地方使用Encoding.UTF8。就连“ANSI”也是模棱两可的:stackoverflow.com/questions/701882/what-is-ansi-format
  • 其实我试过Encoding.ASCII、Encoding.Unicode、Encoding.BigEndianUnicode、Encoding.GetEncoding(1252),默认是唯一给我一些结果的。我没有尝试 UTF8,因为我在堆栈上读到 Unicode 和 UTF 是一回事。问题是我不知道旧机器可以读取哪种编码,而“默认”是唯一完成这项工作的编码。 (然后将按照 Jon Skeet 的建议尝试 UTF8)
  • @JonSkeet 是的,也读过有关 ANSI 的文章,但目前这是唯一成功的,现在将尝试 UTF7、8 和 32 以防万一)
  • @Siegfried.V:是的,这绝对是你需要知道的——不是基于实验,而是基于他们的实际代码。 他们完全有可能使用Encoding.Default的等价物,这意味着您需要知道您将在哪台机器上按顺序运行他们的代码为那台机器生成一个文件:(

标签: c# encoding stream


【解决方案1】:

当我用 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。

【讨论】:

  • 事实上这是最接近的答案,我还发现在堆栈上(但忘记了链接),尝试过但也没有用,我认为会继续这样做
  • 好的,所以我回到了初始点,但至少我理解了一些东西:Windows-1251 是好的编码。但在某些情况下它有效,在某些情况下则无效(我将编辑问题,因为它很长需要评论)。
  • 我发现问题出在哪里:这不是由于编码,而是由于 Notepad++。我不知道为什么,但记事本++ 并不总是能够读取文件。当我将文件发送到外部软件时,即使记事本无法读取它,它也能正常工作。 (在它因其他原因不起作用之前,该软件只接受大写字母)。感谢您的帮助
【解决方案2】:

.NET Encoding code

调用 Encoding.Default 会向操作系统询问其 Windows 嵌入式编码,很可能是 UTF-8。该页面建议您尽可能使用 UTF-8 或 UTF-16(很可能是第一个)。如果您想了解更多信息,请尝试this post

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多