StreamReader не читает японские символы из CSV-файла

1

Чтение csv файла с помощью средства чтения потока с полями в двойных кавычках японских символов. Его не читают японские символы и принимают его как символы Юникода. Я пробовал разные типы кодирования, но не работал для меня. Пожалуйста, поделитесь мной идеей или каким-то другим решением для решения этой проблемы. Или есть лучший способ сделать это.

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;
} 

Изображение 174551

  • 1
    Какие типы кодирования вы использовали? Японские символы не могут быть закодированы в строке ASCII. Любая подсказка, сколько их? Более 4000 IIRC. Нет способа сделать это в 1 байте ASCII. Что означает, что либо файл является чистым мусором, либо это вообще не ASCII, а какой-то UNICODE.
  • 2
    @TomTom: Следует отметить, что OP нигде не заявляет, что они предполагают, что файл является ASCII-кодированным; фактически они устанавливают Encoding.UTF8 как кодировку считывателя. (Очевидно, что это все еще не кодировка файла, но он уже соответствует вашему предложению предположить, что «вовсе не ASCII, а какой-то UNICODE».)
Показать ещё 7 комментариев
Теги:
winforms
c#-4.0
c#-3.0
fastercsv

1 ответ

7
Лучший ответ

На ваших скриншотах видно много бриллиантов, поэтому единственное, что кристалл состоит в том, что текстовый файл не закодирован в utf-8. Вы должны очень сильно подумать о том, чтобы связаться с программистом, который сгенерировал файл и попросил исправить. Не используя кодировку Юникода в наши дни, особенно для языка, такого как японский, который имеет много кодировок, ни одна из них не является доминирующей, является большой ошибкой. Это было так плохо, что язык получил свое собственное слово от страданий, которые он вызвал.

Возможности:

  • 932: Shift-JIS в Windows
  • 20932, 51932: EUC на Unix
  • 50220, 50221, 50222: ISO 2022
  • несколько кодовых страниц EBCDIC, с которыми вы не должны мириться.
  • 0
    Большое спасибо текст был закодирован Shift-JIS

Ещё вопросы

Сообщество Overcoder
Наверх
Меню