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

neo*_*neo 2 c# fastercsv winforms c#-3.0 c#-4.0

使用带有日文字符双引号字段的流阅读器读取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;
} 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Han*_*ant 7

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

可能性:

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