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



我遇到了用ISO-8859-1编码将C#中的字符串(我假设是UTF-16/Unicode)转换为文件的问题。

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?

这里需要理解的一件事是.Net字符串和字符是使用.Net的内部编码(UTF-16或Framework的系统代码页和Core的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));

最新更新