我在使用OleDbConnection从文本文件中读取非ASCII字符时遇到问题。有任何想法吗?
以下是用于复制问题的测试方法:
[TestMethod]
public void TestMethod1()
{
var arquivo = new FileInfo(@"P:\import.txt");
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"{0}\\\";Extended Properties=\"Text;IMEX=1;FMT=Delimited\"", arquivo.DirectoryName);
var conexaoFonteDados = new OleDbConnection(connectionString);
conexaoFonteDados.Open();
string instrucaoSql = "SELECT * FROM [" + arquivo.Name + "]";
var com = new OleDbCommand(instrucaoSql, conexaoFonteDados);
if (com.Connection.State != ConnectionState.Open)
{
com.Connection.Open();
}
var drDadosImportacao = com.ExecuteReader(CommandBehavior.CloseConnection);
while (drDadosImportacao != null && drDadosImportacao.Read())
{
object valorImportado = drDadosImportacao["Column"];
Console.WriteLine(valorImportado);
}
}
以下是 import.txt 文件内容:
Column
a
b
ç
á
以下是控制台的输出:
a
b
?
?
如上所述here,您可以使用类似于此的方法将字符串转换为正确的编码:
public static class MyStringExtensions
{
private static readonly Encoding Iso = Encoding.GetEncoding("ISO-8859-1");
public static string RepairUtf8(this string value)
{
byte[] bytes = Iso.GetBytes(value);
return bytes.Any(o => o.Equals(195)) ? Encoding.UTF8.GetString(bytes) : value;
}
}
答案 0 :(得分:1)
首先,您需要确定文本文件使用的编码。然后在连接字符串中指定文本编码。
例如,这将是您的连接字符串,它也指定UTF-8编码(<table ng-table="tableParams" class="table">
<tr ng-repeat="w in $data">
<td data-title="'ID'">
...
)。将CharacterSet
替换为文本文件使用的实际编码:
UTF8
因为我使用OleDB已经有一段时间了,所以我无法确定Microsoft.ACE.OLEDB提供商是否理解UTF8,ISO-8859-1等编码的名称......如果它似乎不起作用,尝试指定codepage identifier of the encoding而不是编码名称(例如,而不是&#34; CharacterSet = UTF8 &#34;您将指定&#34 ; CHARACTERSET = 65001 &#34;。)