使用 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));
在 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));