【发布时间】: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的等价物,这意味着您需要知道您将在哪台机器上按顺序运行他们的代码为那台机器生成一个文件:(