使用StreamWriter将Unicode字符串写入文件无法工作

12

我有这段代码:

string s = "آ";
StreamWriter writer = new StreamWriter("a.txt", false, Encoding.UTF8);
writer.WriteLine(s);

但是当我运行它时,我在a.txt中看不到任何“آ”字符!a.txt中没有任何字符串!是什么问题???有人可以帮我吗?


1
你看到了什么?你用什么打开文件的? - Oded
6个回答

33

你从来没有调用 Close() 方法关闭 StreamWriter

如果你在写完后调用 writer.Close(),就会看到字符。

但是,由于它实现了 IDisposable 接口,你应该使用 using 语句来包装创建 StreamWriter 的过程:

using(StreamWriter writer = new StreamWriter("a.txt", false, Encoding.UTF8))
{
   writer.WriteLine(s);
}
这将为您关闭流。

5
看起来你在结束应用程序之前没有使用Flush()Close()关闭StreamWriterStreamWriter在内部使用缓冲区,需要在关闭应用程序之前刷新缓冲区,否则你写入的数据将不会被写入磁盘。
你可以在完成后调用Close(),但我建议使用using语句,以确保你的StreamWriter得到正确处理和释放。
string s = "آ";

using (StreamWriter writer = new StreamWriter("a.txt", false, Encoding.UTF8))
{
    writer.WriteLine(s);
}

4
尝试使用File.WriteAllText("a.txt", s, Encoding.UTF8);

0
一些小提示:
  • 你是否在文件中看到了你期望的字符?如果没有,那么你没有刷新和关闭流。
  • StreamWriter 应该能够写入 Unicode,而无需选择编码,但你可以尝试使用 UTF32 编码。

请查看 如何:将文本写入文件


0

请跟随以下完整函数,将列表视图正确导出到Excel并包含特殊字符:

private void Exportar()
    {
        Encoding encoding = Encoding.UTF8;

        saveFileDialog1.Filter = "Arquivo Excel (*.xls)|*.xls";
        saveFileDialog1.FileName = "logs";
        saveFileDialog1.Title = "Exportar para Excel";
        StringBuilder sb = new StringBuilder();
        foreach (ColumnHeader ch in lstPesquisa.Columns)
        {
            sb.Append(ch.Text + "\t");
        }
        sb.AppendLine();
        foreach (ListViewItem lvi in lstPesquisa.Items)
        {
            foreach (ListViewItem.ListViewSubItem lvs in lvi.SubItems)
            {
                if (lvs.Text.Trim() == string.Empty)
                {
                    sb.Append(" ");
                }
                else
                {
                    string ITEM = Regex.Replace(lvs.Text, @"\t|\n|\r", "");//remover novas linhas
                    sb.Append(ITEM + "\t");
                }
            }
            sb.AppendLine();
        }
        DialogResult dr = saveFileDialog1.ShowDialog();
        if (dr == DialogResult.OK)
        {
            StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF32);
            sw.Write(sb.ToString());
            sw.Close();
        }
    }

0
如果您想从包含Unicode字符的某个位置读取文件,然后进行一些修改并写回文件,则会出现问题。我曾经遇到过同样的问题。以下是对我有效的解决方案:
从包含Unicode字符的文件中读取数据
List<string>fileData= File.ReadAllLines("URPath",Encoding.Default).ToList());
//Any modifications
File.WriteAllLines("URPath", hstFileData,Encoding.Default);

我知道这不太漂亮,但它确实起作用了。 希望这可以帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接