使用 StreamWriter 使用 ISO-8859-1 编码将带有重音字母的 C# 字符串写入文件

Using StreamWriter to write to file a C# string with accented letters using ISO-8859-1 encoding

在 C# 中将字符串(我假设它在 UTF-16/Unicode 中)转换为使用 ISO-8859-1 编码输出到文件的问题一直困扰着我。

string s = "Gibt es ein Restaurant in der Nähe";
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding unicode = Encoding.Unicode;
byte[] unicodeBytes = Encoding.Unicode.GetBytes(s);
byte[] isoBytes = Encoding.Convert(unicode, iso, unicodeBytes);

// convert the new byte[] to char[]
char[] isoChars = new char[iso.GetCharCount(isoBytes, 0, isoBytes.Length)];
iso.GetChars(isoBytes, 0, isoBytes.Length, isoChars, 0);

StreamWriter sw = new StreamWriter(output, iso);
sw.Write(isoChars, 0, isoChars.Length);
sw.Write(Environment.NewLine, 0, Environment.NewLine.Length); '

我的输出文本文件显示带问号的文本:

Gibt es ein Restaurant in der N?he

这里要理解的一件事是.Net 字符串和字符总是 使用.Net 的内部编码(UTF-16 或框架的系统代码页和 UTF-8核)。因此,如果您需要特定的编码,将导出的字节数组转换为新的编码并加载回 char[] 将无助于您。相反,您必须写入字节。

但是,对 StreamWriter 本身使用正确的编码应该可以处理您需要的一切,这意味着您应该能够像这样简化代码:

string s = "Gibt es ein Restaurant in der Nähe";
Encoding iso = Encoding.GetEncoding("iso-8859-1");
using (var sw = new StreamWriter(output, iso))
{
    sw.WriteLine(s);
}

最后,在观察结果时,请确保使用能够理解所选编码的文本编辑器。有可能一切都正确,但如果您在不知道如何显示该字形的编辑器或字体中检查它,就会看到坏字符。

为什么要将字节转换为字符?除非您将在其他地方使用这些字符,否则您不必这样做。

这对我有用:

        string s = "Gibt es ein Restaurant in der Nähe";
        Encoding iso = Encoding.GetEncoding("ISO-8859-1");
        Encoding unicode = Encoding.Unicode;
        byte[] unicodeBytes = unicode.GetBytes(s);
        byte[] isoBytes = Encoding.Convert(unicode, iso, unicodeBytes);

        // convert the new byte[] to char[]
        //char[] isoChars = new char[iso.GetCharCount(isoBytes, 0, isoBytes.Length)];
        //iso.GetChars(isoBytes, 0, isoBytes.Length, isoChars, 0);

        StreamWriter sw = new StreamWriter(output, iso);
        sw.Write(iso.GetString(isoBytes));