Символы Юникода в импорте OLE CSV - PullRequest
2 голосов
/ 14 марта 2011

У меня есть следующий фрагмент кода. Это используется для импорта файлов CSV, которые поставляются нам из разных мест по всему миру. Формат файла тот же, и на самом деле довольно простой: имя, фамилия, адрес электронной почты и некоторые даты, а также один или два других текстовых столбца. У меня проблема в том, что некоторые неанглийские символы, русские, немецкие, испанские символы импортируются неправильно. Когда я смотрю на содержимое файла в DataTable, он выдает, например, «ÐÐ½Ð´Ñ € ей», когда он должен выдавать «Андрей» и так далее. Я очень долго искал и, похоже, не могу найти решения. Если я сохраню файл в xls, а затем импортирую его, изменив строку подключения, конечно, она будет работать нормально, поэтому кажется, что реактивный двигатель может обрабатывать символы Юникода. Любая помощь будет оценена. Если это имеет значение, я использую VS 2010 на Windows 7 64 бит. Заранее спасибо!

  string filename = @"C:\Data\Test.csv";
  string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data;Extended Properties=""text;CharacterSet=UNICODE;HDR=Yes;FMT=Delimited"";";
  string commString = string.Format("Select * from {0}", filename);

  DataTable dt = new DataTable();
  using (OleDbConnection connection = new OleDbConnection(connString))
  {
    connection.Open();
    using (OleDbDataAdapter da = new OleDbDataAdapter(commString, connection))
    {
      da.Fill(dt);
    }
  }

Ответы [ 2 ]

2 голосов
/ 31 мая 2017

Попробуйте

CharacterSet = 65001

в вашей строке подключения для UTF-8.

string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data;Extended Properties=""text;characterset=65001;HDR=Yes;FMT=Delimited"";";

Перейдите по ссылке для других кодов.

2 голосов
/ 06 апреля 2011

Продукты Microsoft (мой единственный опыт работы с Excel) требуют метки порядка байтов (BOM) в качестве первых 2 (для UTF-16 *) или 3 (для UTF-8) байтов в файле.Когда вы сохраняете файл из Excel как «Unicode Text», вы можете видеть, что он встраивает FF FE в качестве первых двух байтов, а остальные ваши данные кодируются как UTF-16LE.И параметры блокнота сохраняются примерно так:

Notepad Encoding     BOM        Character Encoding
-------------------  ---------  --------------------
Unicode              FF FE      UTF-16LE
Unicode Big Endian   FE FF      UTF-16BE
Utf8                 EF BB BF   UTF-8

Так что проверьте файлы CSV в шестнадцатеричном редакторе или что-то в этом роде, чтобы увидеть, есть ли метка порядка байтов.Я подозреваю, что это будет отсутствовать и прямо в данные.Поскольку необработанные байты для вашей строки UTF-8 интерпретируются как windows-1252

UTF-8 String:  Андрей
Bytes:         D0 90 D0 BD D0 B4 D1 80 D0 B5 D0 B9
Windows-1252:  Ð<ERR>ндрей
Where <ERR> is because x90 is not a valid windows-1252 byte

http://sodved.awardspace.info/unicode.pl

Это оставит вас с двумя вариантами:

  • Если вы знаете, какова кодировка файлов (похоже на UTF-8 из ваших симптомов), то посмотрите, можете ли вы указать это для обработки файлов.Часто для этого есть какой-то параметр или опция
  • Добавить порядок байтов к данным перед обработкой
...