OLE CSV导入中的Unicode字符

时间:2011-03-14 15:28:18

标签: unicode csv utf-8 oledb ole

我有以下代码段。这用于导入从世界各地的多个位置提供给我们的CSV文件。文件格式相同,实际上非常简单,名字,姓氏,电子邮件和一些日期以及一个或两个其他文本列。我遇到的问题是一些非英文字符,俄语,德语,西班牙语字符未正确导入。当我查看DataTable中文件的内容时,它会产生“ÐнÐ'Ñ€Ðμй”,它应该产生“Андрей”等等。我已经找了很长时间,似乎无法找到解决方案。如果我将文件保存到xls然后导入它,更改我的连接字符串当然它工作正常,所以看起来喷气引擎可以处理unicode字符。任何帮助,将不胜感激。如果重要的话我在Windows 7 64位上使用VS 2010。提前谢谢!

  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 个答案:

答案 0 :(得分:2)

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

这将为您提供两个选择:

  • 如果您知道文件的编码是什么(看起来像您的syptoms中的UTF-8),那么看看您是否可以将其指定为文件处理。通常有一些参数或选项
  • 在处理之前将字节顺序添加到数据

答案 1 :(得分:2)

尝试

  

字符集= 65001

在UTF-8的连接字符串中。

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

关注link以获取其他代码。