在做一个系统,数据没有存入数据库,从控件中获取后要csv格式,但打开后其中有一些乱码,用记事本打开就没有问题?
网上看了一些方法,也搞不了//保存并导出为CVS文件格式
        private void btnSave_Click(object sender, EventArgs e)
        {
            // 数据填写规则校验
            if (this.isSave() == false)
            {
                MessageBox.Show("很抱歉,请完整填写好表单内容!");
                return;
            }
            else
            {
                //数据保存并导出
                //取值
                string writer = this.txtwriter.Text;
                string checker = this.txtchecker.Text;
                string years = this.cboyears.Text.Trim();
                string month = this.cbomonth.Text.Trim();
                string logDate = years + "-" + month;
                // 定义数组
                string[] str = new string[29];
                str[0] = hos;
                str[1] = this.txttotalTrainingDoctor.Text.Trim();
                str[2] = this.txttotalTrainingNurse.Text.Trim();                str[3] = this.txtgynecologyTrainingDoctor.Text.Trim();
                str[4] = this.txtgynecologyTrainingNurse.Text.Trim();                str[5] = this.txtfield1.Text.Trim();
                str[6] = this.txtfield2.Text.Trim();
                str[7] = this.txtfield3.Text.Trim();
                str[8] = this.txtfield4.Text.Trim();                str[9] = this.txtdevice1.Text.Trim();
                str[10] = this.txtdevice2.Text.Trim();
                str[11] = this.txtdevice3.Text.Trim();
                str[12] = this.txtdevice4.Text.Trim();                str[13] = this.cbosoftwareNetware.Text.Trim();                str[14] = this.chksystemSetup1.Checked ? "1" : "0";
                str[15] = this.chksystemSetup2.Checked ? "1" : "0";
                str[16] = this.chksystemSetup3.Checked ? "1" : "0";
                str[17] = this.chksystemSetup4.Checked ? "1" : "0";
                str[18] = this.chksystemSetup5.Checked ? "1" : "0";
                str[19] = this.chksystemSetup6.Checked ? "1" : "0";
                str[20] = this.chksystemSetup7.Checked ? "1" : "0";
                str[21] = this.chksystemSetup8.Checked ? "1" : "0";
                str[22] = this.chksystemSetup9.Checked ? "1" : "0";
                str[23] = this.chksystemSetup10.Checked ? "1" : "0";
                str[24] = logDate;
                str[25] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                str[26] = this.txttdTotal.Text.Trim();
                str[27] = this.txtgyTotal.Text.Trim();
                str[28] = "盆底";
                
                List<string[]> generallist = new List<string[]>();
                generallist.Add(str);
                FileGenerator fileGenerator = new FileGenerator();
                // 根据文件类型生成导出文件
                fileGenerator.GenerateFileByType(generallist, "SetupReport", FileGenerator.FileType.CSV);
                this.Controls.Clear();
                MessageBox.Show("建立成功!!");
                this.Close();
                
            }
        }

解决方案 »

  1.   

    解码问题,看看你的txt是utf-8编码还是unicode编码。
    然后使用Encoding类:using System;
    using System.Text;public class SamplesEncoding  {   public static void Main()  {      // The characters to encode:
          //    Latin Small Letter Z (U+007A)
          //    Latin Small Letter A (U+0061)
          //    Combining Breve (U+0306)
          //    Latin Small Letter AE With Acute (U+01FD)
          //    Greek Small Letter Beta (U+03B2)
          //    a high-surrogate value (U+D8FF)
          //    a low-surrogate value (U+DCFF)
          char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };      // Get different encodings.
          Encoding  u7    = Encoding.UTF7;
          Encoding  u8    = Encoding.UTF8;
          Encoding  u16LE = Encoding.Unicode;
          Encoding  u16BE = Encoding.BigEndianUnicode;
          Encoding  u32   = Encoding.UTF32;      // Encode the entire array, and print out the counts and the resulting bytes.
          PrintCountsAndBytes( myChars, u7 );
          PrintCountsAndBytes( myChars, u8 );
          PrintCountsAndBytes( myChars, u16LE );
          PrintCountsAndBytes( myChars, u16BE );
          PrintCountsAndBytes( myChars, u32 );   }
       public static void PrintCountsAndBytes( char[] chars, Encoding enc )  {      // Display the name of the encoding used.
          Console.Write( "{0,-30} :", enc.ToString() );      // Display the exact byte count.
          int iBC  = enc.GetByteCount( chars );
          Console.Write( " {0,-3}", iBC );      // Display the maximum byte count.
          int iMBC = enc.GetMaxByteCount( chars.Length );
          Console.Write( " {0,-3} :", iMBC );      // Encode the array of chars.
          byte[] bytes = enc.GetBytes( chars );      // Display all the encoded bytes.
          PrintHexBytes( bytes );   }
       public static void PrintHexBytes( byte[] bytes )  {      if (( bytes == null ) || ( bytes.Length == 0 ))
             Console.WriteLine( "<none>" );
          else  {
             for ( int i = 0; i < bytes.Length; i++ )
                Console.Write( "{0:X2} ", bytes[i] );
             Console.WriteLine();
          }   }}
    /* 
    This code produces the following output.System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
    System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
    System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
    System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
    System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00*/
      

  2.   

    你的 FileGenerator  是什么?给个Encoding就不会乱码了。。
      

  3.   

    Encoding:UTF-8,在導出的時候設置編碼格式