我有以下代码段。这用于导入从世界各地的多个位置提供给我们的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);
}
}
答案 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
这将为您提供两个选择:
答案 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以获取其他代码。