StreamReader不从csv文件中读取日文字符

时间:2014-08-24 07:57:44

标签: c# winforms c#-4.0 c#-3.0 fastercsv

使用带有双引号日文字符的字段的流阅读器读取csv文件。它不读日文字符并将其视为unicode字符。我尝试了不同的编码类型,但它不适合我。请与我分享一些想法或解决此问题的其他解决方案。或者有更好的方法来做到这一点。

public DataTable ReadDataFromCSV(string path, char delim)
{
    string fulltext;
    string[] arrColumnNames;
    string[] arrColumnValues;
    string[] arrRows;
    int i, j, n;

    System.Data.DataTable dt = new System.Data.DataTable();
    DataRow row;
    if (delim.ToString().Length < 1)
    {
        delim = ',';
    }
    try
    {
        //' check that the file exists before opening it
        if (File.Exists(path))
        {
            using (TextReader sr = new StreamReader(path,Encoding.UTF8))
            {
            fulltext = sr.ReadToEnd();
            arrRows = fulltext.Split('\n');
            arrColumnNames = arrRows[0].Replace('"', ' ').Trim().Split(delim);
            //'add columns to a datatable
            for (n = 0; n < arrColumnNames.Length - 1; n++)
            {
                dt.Columns.Add(new DataColumn(arrColumnNames[n], System.Type.GetType("System.String")));
            }//next
            for (i = 1; i < arrRows.Length - 1; i++)
            {
                arrColumnValues = arrRows[i].Replace('"', ' ').Trim().Split(delim);
                row = dt.NewRow();
                for (j = 0; j < (arrColumnNames.Length - 1); j++)
                {
                    try
                    {
                        if (!(arrColumnValues[j] == null))
                        {
                            row[arrColumnNames[j]] =                      arrColumnValues[j].Replace('"', ' ').Trim();
                        }
                        else
                        {
                            row[arrColumnNames[j]] = "";
                        }//End If
                    }

                    catch (Exception ex)
                    {
                        Console.Write("ERROR: " + ex.Message);
                    }
                }//next
                dt.Rows.Add(row);
            }//next

        }
        }//End if
    }
    catch (Exception ex)
    {
        Console.Write("ERROR: " + ex.Message);
    }

    finally
    {

    }//End Try

    return dt;
} 

enter image description here

1 个答案:

答案 0 :(得分:7)

屏幕截图中可以看到很多钻石,因此唯一的结果是文本文件在utf-8中编码。您应该非常强烈地考虑与生成该文件的程序员联系并要求修复。这些天不使用Unicode编码,特别是对于像日语这样有许多编码的语言,没有一个是主导,这是一个巨大的错误。语言因为它造成的痛苦而得到own word这是非常糟糕的。

的可能性:

  • 932:Windows上的Shift-JIS
  • 20932,51932:Unix上的EUC
  • 50220,50221,50222:ISO 2022
  • 几个EBCDIC代码页,你不应该忍受。