【问题标题】:StreamReader not reading japanese characters from csv file [closed]StreamReader 未从 csv 文件中读取日文字符 [关闭]
【发布时间】:2014-10-17 15:30:52
【问题描述】:

使用流式阅读器读取带有日文字符双引号字段的 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;
} 

【问题讨论】:

  • @TomTom:应该注意的是,OP 没有在任何地方说明他们假设文件是​​ ASCII 编码的;事实上,他们确实将Encoding.UTF8 设置为阅读器的编码。 (显然,这仍然不是文件的编码,但它已经满足了您假设“根本不是 ASCII,而是某种 UNICODE”的建议。)
  • 我也没有收到@TomTom 的评论,为什么要把 ascii 带入这个讨论? .NET 不会默认为 ascii,即使他没有指定它,也没有理由认为使用日文字符的人会认为文件是 ASCII?
  • Neo,如果您能提供文件以便我们重现此文件会更容易。另外你的操作系统是什么语言/安装了日语吗? (也许它正在正确读取文件,但 Visual Studio 没有可用于渲染的字符集?)
  • 每个标准的 CSV 不是 Unicode 编码的,以防万一有人没有意识到这一点。 Unicode / UTF 标准还要求文件中似乎缺少前缀(字节顺序标记)。这意味着如果文件包含 Unicode 编码元素,它是 - 啊 - 没有有效编码。请参阅unicode.org/mail-arch/unicode-ml/y2002-m04/0064.html 了解有关 UTF 如何按标准工作的一些基础知识。
  • @TomTom:您链接到的文件明确声明“UTF-8 不需要 BOM”。因此,您关于文件自动“未有效编码”的说法是不正确的。

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


【解决方案1】:

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

可能性:

  • 932:Windows 上的 Shift-JIS
  • 20932、51932:Unix 上的 EUC
  • 50220、50221、50222:ISO 2022
  • 几个 EBCDIC 代码页,没有一个是您应该忍受的。

【讨论】:

  • 非常感谢文本是 Shift-JIS 编码的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多