从数据库中读取时的UTF-8编码(C#)

时间:2016-05-13 20:04:40

标签: c# database encoding utf-8

我有一个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()。那我该怎么办?

1 个答案:

答案 0 :(得分:0)

问题的根源在于数据库的结尾。假设SQL Server,请查看有关Collation and Unicode Support的此链接。基本上,您的数据可能不会以您正在考虑的格式返回。

一般情况下,SQL支持UTF-16,而不是UTF-8 - 因此如果数据正确返回,ToString()应正确解码,因为.NET字符串格式为UTF-16。

此外,如果您不特别关心该特定字符,您只需更新您的数据库记录并设置&#34;正常&#34;撇号为那行文字。