OLE CSV导入中的Unicode字符

OLE CSV导入中的Unicode字符,unicode,csv,utf-8,oledb,ole,Unicode,Csv,Utf 8,Oledb,Ole,我有以下代码片段。这用于导入从世界各地多个位置提供给我们的CSV文件。文件格式是相同的,实际上非常简单,名字、姓氏、电子邮件和一些日期以及一个或两个其他文本列。我的问题是一些非英语字符,俄语、德语、西班牙语字符没有正确导入。当我查看它生成的数据表中的文件内容时,例如,当它应该生成“АÐÐÐÐÐД等。我找了很长时间,似乎找不到解决办法。如果我将文件保存到xls中,然后导入它,更改连接字符串当然可以,因此jet引擎似乎可以处理unicode字符。任何帮助都将不胜感激。如果重要的话,我在Window

我有以下代码片段。这用于导入从世界各地多个位置提供给我们的CSV文件。文件格式是相同的,实际上非常简单,名字、姓氏、电子邮件和一些日期以及一个或两个其他文本列。我的问题是一些非英语字符,俄语、德语、西班牙语字符没有正确导入。当我查看它生成的数据表中的文件内容时,例如,当它应该生成“АÐÐÐÐÐД等。我找了很长时间,似乎找不到解决办法。如果我将文件保存到xls中,然后导入它,更改连接字符串当然可以,因此jet引擎似乎可以处理unicode字符。任何帮助都将不胜感激。如果重要的话,我在Windows7 64位上使用VS2010。提前谢谢

  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);
    }
  }
Microsoft产品(我唯一的经验是使用excel)需要一个字节顺序标记(BOM)作为文件中的前2个字节(对于UTF-16*)或3个字节(对于UTF-8)。当您将excel中的文件保存为“Unicode文本”时,您可以看到它将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
UTF-8串:Ааа
字节:D0 90 D0 BD D0 B4 D1 80 D0 B5 D0 B9
Windows-1252:
其中是因为x90不是有效的windows-1252字节

这将给您留下两个选择:

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

字符集=65001

在UTF-8的连接字符串中

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

其他代码请按照说明进行操作。

我尝试了您编写的示例代码(除了更改路径),效果很好。我用记事本制作了一个test.csv文件,将您的示例值复制到其中,并将其保存为Unicode。我在调试器中查看了数据表,该值看起来是正确的。因此,尽管这对你一点帮助都没有,但知道“它在世界上至少有一台机器上工作”可能会令人鼓舞。我的也是64位win7。当时我碰巧打开了VS2005,并在那里运行了它,但我怀疑这会有什么不同。我遇到了一个问题,CSV文件中的符号被修改,从而无法与我的regexp匹配。我非常慌乱,开始编辑文件,确实看到了上面提到的一些标签。谢谢-这是一篇很棒的帖子,它启发了我潜在的问题。现在,我想知道是否可以让powershell的导入csv函数使用特定的编码!别担心。不幸的是,艰难的道路似乎是学习这些东西的唯一途径——对我来说,这无疑是(现在仍然是)