Запись строки Unicode в файле с помощью StreamWriter не работает

У меня есть этот код:

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

но когда я запускаю его, я не вижу никакого "آ" в a.txt!! В a.txt нет ни одной строки! Это Пусто! Что проблема!?! Может кто-нибудь мне помочь???

Ответ 1

Вы никогда не Close() StreamWriter.

Если вы назовете writer.Close(), когда закончите писать, вы увидите символ.

Но, поскольку он реализует IDisposable, вы должны обернуть создание StreamWriter в инструкции using:

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

Это закроет поток для вас.

Ответ 2

По внешнему виду вы не Flush() ing или Close() с StreamWriter до того, как вы закончите свое приложение. StreamWriter использует внутренний буфер, который необходимо очистить перед закрытием приложения, или StreamWriter выходит за пределы области действия, иначе данные, которые вы ему написали, не будут записаны на диск.

Вы можете позвонить Close(), как только вы закончите, хотя вместо этого я бы предложил использовать using, чтобы также гарантировать, что ваш StreamWriter получает надлежащее расположение.

string s = "آ";

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

Ответ 3

Попробуйте использовать File.WriteAllText("a.txt", s, Encoding.UTF8);.

Ответ 4

Несколько советов:

  • Вы видите какого-либо символа в файле, написанном вместо того, который вы ожидаете? Если нет, вы не очищаете и не закрываете поток.
  • StreamWriter должен иметь возможность записывать unicode без необходимости выбирать кодировку, но вы можете попробовать использовать кодировку UTF32.

Отметьте Как записать текст в файл

Ответ 5

Следуйте, заполните функцию для экспорта списка, чтобы преуспеть с правильными специальными символами:

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();
        }
    }