Запись строки Unicode в файл с использованием StreamWriter не работает - PullRequest
11 голосов
/ 19 ноября 2011

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

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

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

Ответы [ 5 ]

31 голосов
/ 19 ноября 2011

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

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

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

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

Это закроет вам поток.

5 голосов
/ 19 ноября 2011

Судя по всему, вы не 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 голосов
/ 19 ноября 2011

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

0 голосов
/ 11 декабря 2015

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

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 голосов
/ 19 ноября 2011

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

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

Проверка Как: записать текст в файл

...