我正在尝试将文件导出到无法识别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”文件(无效)。
在字符串中,没有我所知道的编码,所以我怎么解释呢?
答案 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)
Calling Encoding.Default要求操作系统提供其Windows嵌入式编码,很可能是UTF-8。该页面建议您尽可能使用UTF-8或UTF-16(很可能是第一个)。如果您想阅读更多内容,请尝试this post。