我有一个C#程序,它从数据库中读取数据并将其输出到文本文件。
OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + tableName, conn);
OleDbDataReader rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
while (rdr.Read())
{
for (int i = 0; i < rdr.FieldCount; i++)
{
string toStr = rdr[i].ToString();
// ...etc.
尤其是一条线路一直给我带来麻烦。以下是数据库中的内容:
Signed 8-bit 2’s-compliment
以下是我的输出文件中的内容:
Signed 8-bit 2’s-compliment
我想我可以通过考虑编码来解决这个问题。所以我改变了我的代码,将文本转换为UTF-8:
string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rdr[i].ToString()));
结果是:
Signed 8-bit 2�s-compliment
但是,如果我这样做......
string toStr = Encoding.UTF8.GetString(Encoding.Default.GetBytes("Signed 8-bit 2’s-compliment"));
......它完美无缺。
Signed 8-bit 2’s-compliment
rdr[i].toString()
会出现问题吗?我的猜测是,当它将对象转换为字符串时,它会搞砸’
字符的编码,这使我无法将其正确转换为撇号。但我认为我不能避免在那里使用toString()
。那我该怎么办?
答案 0 :(得分:0)
问题的根源在于数据库的结尾。假设SQL Server,请查看有关Collation and Unicode Support的此链接。基本上,您的数据可能不会以您正在考虑的格式返回。
一般情况下,SQL支持UTF-16,而不是UTF-8 - 因此如果数据正确返回,ToString()
应正确解码,因为.NET字符串格式为UTF-16。
此外,如果您不特别关心该特定字符,您只需更新您的数据库记录并设置&#34;正常&#34;撇号为那行文字。