web-dev-qa-db-ja.com

StreamWriterを使用したファイルへのUnicode文字列の書き込みが機能しない

私はこのコードを持っています:

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

しかし、実行すると、a.txtに「آ」が表示されません。 a.txtに文字列がありません!それは空です!何が問題なの!?!誰かが私を助けることができますか?

12

Close()StreamWriterは決してありません。

書き込みが終了したときにwriter.Close()を呼び出すと、文字が表示されます。

ただし、IDisposableを実装しているため、StreamWriterの作成をusingステートメントでラップする必要があります。

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

これにより、ストリームが閉じられます。

31
Oded

見た目では、終了する前に Flush() ingまたは Close()StreamWriterを実行していませんあなたの申請。 StreamWriterは内部でバッファを使用します。このバッファは、アプリケーションを閉じる前にフラッシュする必要があります。そうしないと、StreamWriterがスコープ外になります。そうしないと、書き込まれたデータがディスクに書き込まれません。

完了したらClose()を呼び出すことができますが、代わりに using ステートメントを使用して、StreamWriterが確実に取得されるようにすることをお勧めします。適切に廃棄されます。

string s = "آ";

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

File.WriteAllText("a.txt", s, Encoding.UTF8);を使用してみてください。

3
MagnatLU

正しい特殊文字を使用してリストビューを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
Vanderley Maia

これらのUnicode文字を含むファイルをどこかから読み取りたい場合は、いくつかの変更を加えてファイルに書き戻すと、問題が発生します。私は同じ問題で立ち往生していました。これが私のために働いた解決策です

Unicode文字を含むファイルからのデータの読み取り

List<string>fileData= File.ReadAllLines("URPath",Encoding.Default).ToList());
//Any modifications
File.WriteAllLines("URPath", hstFileData,Encoding.Default);

私はこれがきれいではないことを知っていますが、それはうまくいきました。お役に立てれば!

0
Shubham Khare

いくつかのヒント:

  • 期待する文字の代わりに書かれたファイルに文字がありますか?そうでない場合は、ストリームをフラッシュして閉じていません
  • StreamWriterは、エンコーディングを選択しなくてもUnicodeを記述できるはずですが、UTF32エンコーディングを使用することもできます。

チェック 方法:ファイルにテキストを書き込む